Sorry it keeps failing if I send the git diff in the attachment. I will try copy the text again. git diffdiff --git a/winsup/cygwin/fhandler_disk_file.cc b/winsup/cygwin/fhandler_disk_file.ccindex bc8fead..525cb32 100644--- a/winsup/cygwin/fhandler_disk_file.cc+++ b/winsup/cygwin/fhandler_disk_file.cc@@ -1525,6 +1525,7 @@ fhandler_disk_file::pread (void *buf, size_t count, off_t offset) IO_STATUS_BLOCK io; LARGE_INTEGER off = { QuadPart:offset }; + memset(&io, 0, sizeof(io)); if (!prw_handle && prw_open (false)) goto non_atomic; status = NtReadFile (prw_handle, NULL, NULL, NULL, &io, buf, count,
On Monday, November 6, 2017, 12:23:44 PM PST, Corinna Vinschen <corinna-cyg...@cygwin.com> wrote: Hi, On Nov 6 19:20, Xiaofeng Liu via cygwin-patches wrote: > pread() return 0 if read beyond end of file in linux, but not zero in cygwin. > I have a small code to show the problem: > #include <sys/types.h> > #include <sys/stat.h> > #include <fcntl.h> > #include <unistd.h> > #include <stdio.h> > #include <errno.h> > > int main() > { > const char* file = "/home/xliu/work/exome/a.bam"; > struct stat st; > stat(file, &st); > char buf[65536]; > int fd = open(file, O_RDONLY); > int ret = pread(fd, buf, sizeof buf, st.st_size); > fprintf(stderr, "filesize %ld, after eof pread() return = %d, errno = %d\n", >st.st_size, ret, errno); > lseek(fd, st.st_size, SEEK_SET); > ret = read(fd, buf, sizeof buf); > fprintf(stderr, "filesize %ld, after eof read() return = %d, errno = %d\n", >st.st_size, ret, errno); > } > $ ./a.exe > filesize 6126093048, after eof pread() return = 3, errno = 0 > filesize 6126093048, after eof read() return = 0, errno = 0 > The issue is that NtReadFile() return EOF status, but doesn't set > io.information to 0. As a result, the current pread() implementation could > return an arbitrary number in the stack. The fix is a one line fix: reset io > status block. > diff --git a/winsup/cygwin/fhandler_disk_file.cc > b/winsup/cygwin/fhandler_disk_file.ccindex bc8fead..525cb32 100644--- > a/winsup/cygwin/fhandler_disk_file.cc+++ > b/winsup/cygwin/fhandler_disk_file.cc@@ -1525,6 +1525,7 @@ > fhandler_disk_file::pread (void *buf, size_t count, off_t offset) > IO_STATUS_BLOCK io; LARGE_INTEGER off = { QuadPart:offset }; > + memset(&io, 0, sizeof(io)); if (!prw_handle && prw_open (false)) > goto non_atomic; status = NtReadFile (prw_handle, NULL, NULL, > NULL, &io, buf, count, your mailer screwed up the patch and so it can't apply. Can you please send it as an attachment? Thanks, Corinna -- Corinna Vinschen Please, send mails regarding Cygwin to Cygwin Maintainer cygwin AT cygwin DOT com Red Hat