Сбой на freeifaddrs () при сохранении аппаратного адреса интерфейса в новой std :: basic_string Linux

Ответить
Anonymous
 Сбой на freeifaddrs () при сохранении аппаратного адреса интерфейса в новой std :: basic_string

Сообщение Anonymous »

Ниже вы можете найти удобную функцию, которую я создал, чтобы получить MAC -адрес сетевого интерфейса. < /p>

Код: Выделить всё

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 () ?>

Подробнее здесь: https://stackoverflow.com/questions/795 ... w-stdbasic
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»