Решено: открытие каталога: сегфол

Модератор: Модераторы разделов

Аватара пользователя
nerezus
Сообщения: 525
Статус: Вселенский отказник
ОС: windoze

Решено: открытие каталога: сегфол

Сообщение nerezus »

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

#include <dirent.h>

bool EnumFilesAndDirs(string &Path)
{
    printf("Dir:");printf(Path.c_str());printf("\n");
    DIR *dir = NULL;
    struct dirent *entry = NULL, *result;
    bool good = false;
    dir = opendir(Path.c_str());
    if (NULL == dir) printf("dir =\\\n");
    while (true) {
        readdir_r(dir, entry, &result);
        if (result == NULL) {
            break;
        }
        good = true;
        string Push = Path + result->d_name;
        printf(Push.c_str());printf("\n");
        //Res.push_back(Push);
    }
    free(dir);
    return good;
}

string d1("/etc/");
EnumFilesAndDirs(d1);


хелп )

P.S. просьба не обращать внимание на стиль при printf - это для дебага, в оригинале я их в вектор пихаю )
ICQ 547097
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Решено: открытие каталога: сегфол

Сообщение Uncle_Theodore »

Память выдели для entry
Вот так, например:

struct dirent *entry = (dirent *)malloc(128), *result;

вместо

struct dirent *entry = NULL, *result;
Спасибо сказали:
Аватара пользователя
nerezus
Сообщения: 525
Статус: Вселенский отказник
ОС: windoze

Re: Решено: открытие каталога: сегфол

Сообщение nerezus »

оо, спасибо!
заработало
ICQ 547097
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: Решено: открытие каталога: сегфол

Сообщение v04bvs »

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

    printf("Dir:");printf(Path.c_str());printf("\n");


Так писать нельзя. Здесь скрыта опасная уязвимость. Представьте, что Path.c_str() вернёт строку "%s". В этом случае printf полезет в стек, достанет адрес и распечатает значение по этому адресу. Аналогичным образом можно проверить весь стек. А в нём может лежать важная информация, например пароли. Правильно делать так:

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

printf("Dir:%s\n", Path.c_str());
Спасибо сказали:
Abaddon
Сообщения: 81
ОС: Gentoo 2006.1.x86_64

Re: Решено: открытие каталога: сегфол

Сообщение Abaddon »

Uncle_Theodore писал(а):
30.05.2007 03:41
struct dirent *entry = (dirent *)malloc(128), *result;

struct dirent *entry = (dirent *)malloc(sizeof(dirent)), *result;
Base: Gentoo 2006.1.x86_64 on AMD64_X2-5200+/1024Mb/7300GS-256Mb/250Gb
Serv: Gentoo 2006.1.x86_32 on iCeleron-2.4/1024Mb/Geforce2MX400-64Mb/250Gb+60Gb
Note: Gentoo 2006.1.x86_32 on Transmeta-8800(Efficeon)/512Mb/(Trident-???)/40Gb
Gate: Gentoo 2005.1.x86_32 on AMD-K6.2-500/64Mb/forgot.../3.2Gb+6.4Gb+40Gb
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Решено: открытие каталога: сегфол

Сообщение Zeus »

nerezus писал(а):
30.05.2007 03:09

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

    if (NULL == dir) printf("dir =\\\n");
    while (true) {
        readdir_r(dir, entry, &result);

А readdir_r'у можно передавать первым параметром NULL?
Спасибо сказали:
Аватара пользователя
nerezus
Сообщения: 525
Статус: Вселенский отказник
ОС: windoze

Re: Решено: открытие каталога: сегфол

Сообщение nerezus »

v04bvs, хе, спасибо за совет, как-то даже не предположил )

А readdir_r'у можно передавать первым параметром NULL?
Код был отправлен на свалку )
ICQ 547097
Спасибо сказали: