diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 63ab22cb6..56e1b5d03 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,11 @@ +Sun Apr 22 12:17:57 2001 Christopher Faylor + + * shortcut.c (check_shortcut): Close input file handle before + returning. + * path.cc (check_sysfile): Ditto. + (symlink_info::check): Rely on opened file handle being closed by + symlink checking routines. Set ext_tacked_on when .lnk is detected. + Sat Apr 21 19:26:05 2001 Christopher Faylor * thread.cc (MTinterface::Init): Remove accidentally checked in code. diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc index 137d913fa..c218a1606 100644 --- a/winsup/cygwin/path.cc +++ b/winsup/cygwin/path.cc @@ -2504,6 +2504,8 @@ check_sysfile (const char *path, DWORD fileattr, HANDLE h, } syscall_printf ("%d = symlink.check_sysfile (%s, %s) (%p)", res, path, contents, *pflags); + + CloseHandle (h); return res; } @@ -2698,29 +2700,29 @@ symlink_info::check (const char *path, const suffix_info *suffixes, res = -1; if (h == INVALID_HANDLE_VALUE) goto file_not_symlink; - else if (sym_check == 1 - && !(res = check_shortcut (suffix.path, fileattr, h, - contents, &error, &pflags))) + + switch (sym_check) { - CloseHandle (h); + case 1: + res = check_shortcut (suffix.path, fileattr, h, contents, &error, &pflags); + if (res) + { + ext_tacked_on = 1; + break; + } /* If searching for `foo' and then finding a `foo.lnk' which is no shortcut, return the same as if file not found. */ - if (suffix.lnk_match ()) - { - fileattr = (DWORD)-1; - continue; /* in case we're going to tack *another* .lnk on this filename. */ - } - goto file_not_symlink; - } - else if (sym_check == 2 && - !(res = check_sysfile (suffix.path, fileattr, h, - contents, &error, &pflags))) - { - CloseHandle (h); - goto file_not_symlink; - } + if (!suffix.lnk_match ()) + goto file_not_symlink; - CloseHandle (h); + fileattr = (DWORD) -1; + continue; /* in case we're going to tack *another* .lnk on this filename. */ + case 2: + res = check_sysfile (suffix.path, fileattr, h, contents, &error, &pflags); + if (!res) + goto file_not_symlink; + break; + } break; } goto out; diff --git a/winsup/cygwin/shortcut.c b/winsup/cygwin/shortcut.c index b7ca86905..b47cec52a 100644 --- a/winsup/cygwin/shortcut.c +++ b/winsup/cygwin/shortcut.c @@ -98,7 +98,7 @@ check_shortcut (const char *path, DWORD fileattr, HANDLE h, goto close_it; /* Read the files header information. This is used to check for a Cygwin or U/WIN shortcut or later to check for executable files. */ - if (! ReadFile (h, file_header, SHORTCUT_HDR_SIZE, &got, 0)) + if (!ReadFile (h, file_header, SHORTCUT_HDR_SIZE, &got, 0)) { *error = EIO; goto close_it; @@ -160,8 +160,7 @@ close_it: psl->lpVtbl->Release(psl); /* Uninitialize COM library. */ CoUninitialize (); + CloseHandle (h); return res; } - -