From fa821be37b56798f70b488530a07adeb2092b69b Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Tue, 5 Jun 2001 09:21:39 +0000 Subject: [PATCH] * fhandler.cc (fhandler_disk_file::fstat): Always reset file position to original value after checking for executable magic. --- winsup/cygwin/ChangeLog | 5 +++++ winsup/cygwin/fhandler.cc | 23 +++++++++++++++-------- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index c4cf3bb2d..3e15d5ee8 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,8 @@ +Tue Jun 5 11:18:00 2001 Corinna Vinschen + + * fhandler.cc (fhandler_disk_file::fstat): Always reset file position + to original value after checking for executable magic. + Mon Jun 4 16:21:00 2001 Corinna Vinschen * cygheap.h (cygheap_user::cygheap_user): Initialize token to diff --git a/winsup/cygwin/fhandler.cc b/winsup/cygwin/fhandler.cc index 15e0e2303..5c613bccd 100644 --- a/winsup/cygwin/fhandler.cc +++ b/winsup/cygwin/fhandler.cc @@ -974,16 +974,23 @@ fhandler_disk_file::fstat (struct stat *buf) buf->st_mode |= S_IFREG; if (!dont_care_if_execable () && !get_execable_p ()) { - DWORD done; + DWORD cur, done; char magic[3]; - /* FIXME should we use /etc/magic ? */ - magic[0] = magic[1] = magic[2] = '\0'; - if (ReadFile (get_handle (), magic, 3, &done, 0) - && done == 3) + + /* First retrieve current position, set to beginning + of file if not already there. */ + cur = SetFilePointer (get_handle(), 0, NULL, FILE_CURRENT); + if (cur != INVALID_SET_FILE_POINTER && + (!cur || + SetFilePointer (get_handle(), 0, NULL, FILE_BEGIN) + != INVALID_SET_FILE_POINTER)) { - if (has_exec_chars (magic, done)) - set_execable_p (); - SetFilePointer (get_handle(), -(LONG) done, NULL, FILE_CURRENT); + /* FIXME should we use /etc/magic ? */ + magic[0] = magic[1] = magic[2] = '\0'; + if (ReadFile (get_handle (), magic, 3, &done, 0) && + done == 3 && has_exec_chars (magic, done)) + set_execable_p (); + SetFilePointer (get_handle(), cur, NULL, FILE_BEGIN); } } if (get_execable_p ())