следующая функция дает ошибку сегментации на strncpy, может кто-то объяснить, почему происходит эта ошибка сегментации - PullRequest
0 голосов
/ 29 мая 2018
IFNAMSIZ = 16

static STATUS_CODE __bind(int sock_fd, const char *interface)
    {

            struct sockaddr sock_addr;
            memset(&sock_addr, '\0', sizeof(sock_addr));
            strncpy(sock_addr.sa_data, interface, IFNAMSIZ);
            sock_addr.sa_family = AF_PACKET;

            if (bind(sock_fd, &sock_addr, sizeof(struct sockaddr)) < 0) {
                    EPRINT("bind failed: %s", strerror(errno));
                    return FAILURE;
            }
        return SUCCESS;
}

1 Ответ

0 голосов
/ 30 мая 2018

может кто-нибудь объяснить, почему происходит эта ошибка сегментации

В Linux ваш код может иметь переполнение стекового буфера здесь:

strncpy(sock_addr.sa_data, interface, IFNAMSIZ);

при условии IFNAMSIZ = 16, потому чтоsizeof(sa_data) == 14.Однако это крайне маловероятно, чтобы вызвать SIGSEGV в strncpy - в стеке много других данных.

Гораздо более вероятной причиной сбоя является то, что interface, который вы прошли, это NULL.Это должно быть легко увидеть, скомпилировав вашу программу с отладочной информацией (обычно -g flag) и запустив ее под отладчиком.

...