std::basic_string *NetworkHelpers::getInterfaceMAC(const char *name)
{
std::basic_string *ret = NULL;
// std::basic_string tmp2;
if (name == NULL)
return NULL;
struct ifaddrs *ifaddrlist = NULL;
int res = getifaddrs(&ifaddrlist);
int err = errno;
if (res) {
printf("NetworkHelpers::getInterfaceMAC: getifaddrs() returned %d, ERROR %d (%s)\n", res, err, strerror(err));
return NULL;
}
for (struct ifaddrs *ifp = ifaddrlist; ifp != NULL; ifp = ifp->ifa_next) {
if ((ifp->ifa_addr) && (ifp->ifa_addr->sa_family == AF_PACKET)) {
struct sockaddr_ll *saddr = (struct sockaddr_ll*)ifp->ifa_addr;
unsigned int i=0;
if (strcmp(ifp->ifa_name, name) == 0) {
// Network interface is the wanted one, fetch MAC address
// ATTEMPT #1: CRASH when freeifaddrs() is called later
// ret = new std::basic_string(saddr->sll_addr, saddr->sll_halen);
// ATTEMPT #2: CRASH when freeifaddrs() is called later
// ret = new std::basic_string();
// ret->assign(saddr->sll_addr, saddr->sll_halen);
// ATTEMPT #3: OK
// unsigned char *buf = new unsigned char[saddr->sll_halen];
// memcpy(buf, saddr->sll_addr, saddr->sll_halen);
// ret = new std::basic_string(buf, saddr->sll_halen);
// delete[] buf;
// ATTEMPT #4: OK
// std::basic_string tmp(saddr->sll_addr, saddr->sll_halen);
// ret = new std::basic_string(tmp);
// ATTEMPT #5: CRASH when freeifaddrs() is called later
// tmp2.assign(saddr->sll_addr, saddr->sll_halen);
// ret = new std::basic_string(tmp2);
printf("NetworkHelpers::getInterfaceMAC(%s) = ", name);
for (i=0; i < ret->length(); i++) {
printf("%02x%s", ret->at(i), (i == (ret->length()-1)) ? "" : ":");
}
printf("\n");
break;
}
}
}
freeifaddrs(ifaddrlist);
return ret;
}
Вы можете увидеть мои 5 различных попыток сохранения результата в std :: basic_string , который вновь выделен и возвращен к вызывающему. Два из них успешны. 20.04 VM; При перемещении одного и того же кода в ARMV7L встроенная машина с пользовательским ядром 3.10.17, я обнаружил, что она сбоя. Также подтверждено, что данные были копией путем изменения исходного буфера), почему я испытываю сбои, когда называется freeifaddrs () ?>
Ниже вы можете найти удобную функцию, которую я создал, чтобы получить MAC -адрес сетевого интерфейса. < /p> [code]std::basic_string *NetworkHelpers::getInterfaceMAC(const char *name) { std::basic_string *ret = NULL; // std::basic_string tmp2;
if (name == NULL) return NULL;
struct ifaddrs *ifaddrlist = NULL; int res = getifaddrs(&ifaddrlist); int err = errno; if (res) { printf("NetworkHelpers::getInterfaceMAC: getifaddrs() returned %d, ERROR %d (%s)\n", res, err, strerror(err)); return NULL; }
for (struct ifaddrs *ifp = ifaddrlist; ifp != NULL; ifp = ifp->ifa_next) { if ((ifp->ifa_addr) && (ifp->ifa_addr->sa_family == AF_PACKET)) { struct sockaddr_ll *saddr = (struct sockaddr_ll*)ifp->ifa_addr; unsigned int i=0;
if (strcmp(ifp->ifa_name, name) == 0) { // Network interface is the wanted one, fetch MAC address
// ATTEMPT #1: CRASH when freeifaddrs() is called later // ret = new std::basic_string(saddr->sll_addr, saddr->sll_halen);
// ATTEMPT #2: CRASH when freeifaddrs() is called later // ret = new std::basic_string(); // ret->assign(saddr->sll_addr, saddr->sll_halen);
// ATTEMPT #3: OK // unsigned char *buf = new unsigned char[saddr->sll_halen]; // memcpy(buf, saddr->sll_addr, saddr->sll_halen); // ret = new std::basic_string(buf, saddr->sll_halen); // delete[] buf;
// ATTEMPT #4: OK // std::basic_string tmp(saddr->sll_addr, saddr->sll_halen); // ret = new std::basic_string(tmp);
// ATTEMPT #5: CRASH when freeifaddrs() is called later // tmp2.assign(saddr->sll_addr, saddr->sll_halen); // ret = new std::basic_string(tmp2);
printf("NetworkHelpers::getInterfaceMAC(%s) = ", name); for (i=0; i < ret->length(); i++) { printf("%02x%s", ret->at(i), (i == (ret->length()-1)) ? "" : ":"); } printf("\n"); break; } } }
freeifaddrs(ifaddrlist); return ret; } [/code] Вы можете увидеть мои 5 различных попыток сохранения результата в std :: basic_string , который вновь выделен и возвращен к вызывающему. Два из них успешны. 20.04 VM; При перемещении одного и того же кода в ARMV7L встроенная машина с пользовательским ядром 3.10.17, я обнаружил, что она сбоя. Также подтверждено, что данные были копией путем изменения исходного буфера), почему я испытываю сбои, когда называется freeifaddrs () ?>