pcap_close () падает, если handle равен NULL - PullRequest
1 голос
/ 21 января 2020

Ожидается ли, что pcap_close(NULL) segfaults? Я наблюдаю это поведение на libpcap-1.7.4-2ubuntu0.1. Страница man ничего не говорит о том, как выглядит функция для NULL pcap_t *. Я гуглил и ничего не смог найти.

Ответы [ 3 ]

3 голосов
/ 21 января 2020

С страница руководства :

#include <pcap/pcap.h>
void pcap_close(pcap_t *p);

pcap_close() закрывает файлы, связанные с p и освобождает ресурсы.

Кажется очевидным, что функция предназначена для использования с valid указателем. Указатель NULL не имеет «связанных файлов» или «ресурсов», которые должны быть освобождены. Функция использует переменную p, предполагая, что это указатель на действительный тип pcap_t. Передача NULL делает разыменование NULL и, конечно, это приводит к ошибке сегментации.

Глядя на исходный код , это еще более очевидно:

void
pcap_close(pcap_t *p)
{
    if (p->opt.device != NULL)
        free(p->opt.device);
    p->cleanup_op(p);
    free(p);
}

Такое поведение встречается довольно часто, и вы найдете его почти в каждой библиотеке C функция, используемая для закрытия / освобождения / очистки ранее запрошенного ресурса. В C проверка NULL почти всегда оставлена ​​вызывающей стороне, если нет, то вы, скорее всего, найдете ее явно написанной в документации.

3 голосов
/ 21 января 2020

Остальные ответы верны. И вообще (не указывается от c до pcap_close), если что-то не задокументировано для принятия нулевого указателя и специальной обработки, по умолчанию всегда должно быть предположение, что передача нулевого указателя является нарушением контакт интерфейса, поскольку нулевой указатель не является действительным указателем на то, что задокументировано функцией, ожидающей получения указателя на.

2 голосов
/ 21 января 2020

Нет документации? просто проверьте исходный код :

void pcap_close(pcap_t *p)
{    
    if (p->opt.device != NULL)

        free(p->opt.device);

    p->cleanup_op(p);

    free(p);
}

первая инструкция читает p->opt.device, что имеет неопределенное поведение, если p равно NULL.

Защита от NULL будет легким улучшением. С другой стороны, cra sh является детерминированным c и может быть легко отлажен при передаче нулевого указателя.

...