LINUX.ORG.RU

История изменений

Исправление 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