Модератор: Модераторы разделов
nerezus
Сообщения: 525
Статус: Вселенский отказник
ОС: windoze
Сообщение
nerezus » 30.05.2007 03:09
Код: Выделить всё
#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
Сообщение
Uncle_Theodore » 30.05.2007 03:41
Память выдели для entry
Вот так, например:
struct dirent *entry = (dirent *)malloc(128), *result;
вместо
struct dirent *entry = NULL, *result;
nerezus
Сообщения: 525
Статус: Вселенский отказник
ОС: windoze
Сообщение
nerezus » 30.05.2007 06:26
оо, спасибо!
заработало
ICQ 547097
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux
Сообщение
v04bvs » 30.05.2007 09:32
Код: Выделить всё
printf("Dir:");printf(Path.c_str());printf("\n");
Так писать нельзя. Здесь скрыта опасная уязвимость. Представьте, что Path.c_str() вернёт строку "%s". В этом случае printf полезет в стек, достанет адрес и распечатает значение по этому адресу. Аналогичным образом можно проверить весь стек. А в нём может лежать важная информация, например пароли. Правильно делать так:
Abaddon
Сообщения: 81
ОС: Gentoo 2006.1.x86_64
Сообщение
Abaddon » 30.05.2007 11:31
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
Сообщение
Zeus » 30.05.2007 12:29
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
Сообщение
nerezus » 30.05.2007 17:52
v04bvs, хе, спасибо за совет, как-то даже не предположил )
А readdir_r'у можно передавать первым параметром NULL?
Код был отправлен на свалку )
ICQ 547097