История изменений
Исправление hateyoufeel, (текущая версия) :
Любой лол!
man 2 read
On error, -1 is returned, and errno is set to indicate the error.
In this case, it is left unspecified whether the file position (if any) changes.
EINTR The call was interrupted by a signal before any data was read; see signal(7).
Кстати, всё ещё банальнее. Если там пусть ведёт не к файлу, а к директории, то read() сфейлит с -1 и EISDIR в errno :D
Ларчик очень просто открывался! Подаёшь на вход директорию вместо файла, код Stanson срёт в штаны^Wстек.
$ cat dir.c
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
int main()
{
int ret, fd;
char buf[256] = { 0 };
fd = open("/", O_RDONLY);
if(fd < 0) {
printf("open failed: %s\n", strerror(errno));
return 0;
}
ret = read(fd, buf, sizeof(buf));
if(ret < 0) {
printf("read failed: %s\n", strerror(errno));
}
close(fd);
return 0;
}
$ gcc dir.c -o dir && ./dir
read failed: Is a directory
Проверки, что он открывает именно файл а не директорию там тоже нет. Так что вот он, 100% просёр мимо буфера прямо в штаны. Даже без экзотических условий.
Исходная версия hateyoufeel, :
Любой лол!
man 2 read
On error, -1 is returned, and errno is set to indicate the error.
In this case, it is left unspecified whether the file position (if any) changes.
EINTR The call was interrupted by a signal before any data was read; see signal(7).
Кстати, всё ещё банальнее. Если там пусть ведёт не к файлу, а к директории, то read() сфейлит с -1 и EISDIR в errno :D
Ларчик очень просто открывался! Подаёшь на вход директорию вместо файла, код Stanson срёт в штаны^Wстек.
$ cat dir.c
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
int main()
{
int ret, fd;
char buf[256] = { 0 };
fd = open("/", O_RDONLY);
if(fd < 0) {
printf("open failed: %s\n", strerror(errno));
return 0;
}
ret = read(fd, buf, sizeof(buf));
if(ret < 0) {
printf("read failed: %s\n", strerror(errno));
}
close(fd);
return 0;
}
$ gcc dir.c -o dir && ./dir
read failed: Is a directory