Found during test of 'stress-ng --pseek ...' from current upstream stress-ng git HEAD:

Testcase:

$ uname -r
3.5.4-1.x86_64

$ cat pfail.c
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>

int main()
{
  int fd = open("pwrite.tmp", O_RDWR|O_CREAT|O_BINARY, 0666);
  if (fd < 0) {
    perror("open"); return 1;
  }

  char c = 42;
  if (pwrite(fd, &c, 1, 0) < 0)
    perror("pwrite");

  if (fork() == 0) {
    if (pread(fd, &c, 1, 0) < 0)
      perror("pread");
    _exit(0);
  }

  int status;
  wait(&status);
  return 0;
}

$ make pfail
cc     pfail.c   -o pfail

$ ./pfail
pread: Bad file descriptor

$ strace ./pfail
...
  617   75356 [main] pfail 10826 dofork: 10827 = fork()
   82   11289 [main] pfail 10827 seterrno_from_nt_status: /usr/src/debug/cygwin-3.5.4-1/winsup/cygwin/fhandler/disk_file.cc:1883 status 0xC0000008 -> windows error 6    80   75436 [main] pfail 10826 wait4: calling proc_subproc, pid -1, options 0    76   11365 [main] pfail 10827 geterrno_from_win_error: windows error 6 == errno 9
   78   75514 [main] pfail 10826 proc_subproc: args: 5, -7728
   64   11429 [main] pfail 10827 pread: -1 = pread(3, 0x7FFFFCC0B, 1, 0), errno 9
...


The problem does not occur if there is no pread()/pwrite() before the fork(). This suggests that the child process inherits the extra handle value used to keep the original seek position, but not the actual handle.

--
Regards,
Christian


--
Problem reports:      https://cygwin.com/problems.html
FAQ:                  https://cygwin.com/faq/
Documentation:        https://cygwin.com/docs.html
Unsubscribe info:     https://cygwin.com/ml/#unsubscribe-simple

Reply via email to