From 0c4023011d7dff1c67ff26e0919b3c6cf82b62ad Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Thu, 9 Apr 2009 17:55:01 +0000 Subject: [PATCH] * syscalls.cc (try_to_bin): Use tmp_pathbuf buffer to allocate infobuf rather than using the stack. --- winsup/cygwin/ChangeLog | 5 +++++ winsup/cygwin/syscalls.cc | 18 ++++++++---------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index cd7bcf45f..7ed7942c7 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,8 @@ +2009-04-09 Corinna Vinschen + + * syscalls.cc (try_to_bin): Use tmp_pathbuf buffer to allocate infobuf + rather than using the stack. + 2009-04-09 Corinna Vinschen * syscalls.cc (try_to_bin): Fix alignment of infobuf. diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc index 6198bef98..7e684e561 100644 --- a/winsup/cygwin/syscalls.cc +++ b/winsup/cygwin/syscalls.cc @@ -153,14 +153,13 @@ try_to_bin (path_conv &pc, HANDLE &fh, ACCESS_MASK access) PFILE_NAME_INFORMATION pfni; PFILE_INTERNAL_INFORMATION pfii; PFILE_RENAME_INFORMATION pfri; - /* Enforce alignment for multi-purpose infobuf buffer */ - BYTE infobuf[sizeof (FILE_NAME_INFORMATION) + 32767 * sizeof (WCHAR)] - __attribute__ ((aligned)); FILE_DISPOSITION_INFORMATION disp = { TRUE }; + tmp_pathbuf tp; + PBYTE infobuf = (PBYTE) tp.w_get (); + pfni = (PFILE_NAME_INFORMATION) infobuf; - status = NtQueryInformationFile (fh, &io, pfni, sizeof infobuf, - FileNameInformation); + status = NtQueryInformationFile (fh, &io, pfni, 65536, FileNameInformation); if (!NT_SUCCESS (status)) { debug_printf ("NtQueryInformationFile (FileNameInformation) failed, %08x", @@ -233,7 +232,7 @@ try_to_bin (path_conv &pc, HANDLE &fh, ACCESS_MASK access) /* Create hopefully unique filename. */ RtlAppendUnicodeToString (&recycler, L"\\cyg"); pfii = (PFILE_INTERNAL_INFORMATION) infobuf; - status = NtQueryInformationFile (fh, &io, pfii, sizeof infobuf, + status = NtQueryInformationFile (fh, &io, pfii, 65536, FileInternalInformation); if (!NT_SUCCESS (status)) { @@ -248,8 +247,7 @@ try_to_bin (path_conv &pc, HANDLE &fh, ACCESS_MASK access) pfri->RootDirectory = rootdir; pfri->FileNameLength = recycler.Length; memcpy (pfri->FileName, recycler.Buffer, recycler.Length); - status = NtSetInformationFile (fh, &io, pfri, sizeof infobuf, - FileRenameInformation); + status = NtSetInformationFile (fh, &io, pfri, 65536, FileRenameInformation); if (status == STATUS_OBJECT_PATH_NOT_FOUND) { /* Ok, so the recycler and/or the recycler/SID directory don't exist. @@ -350,7 +348,7 @@ try_to_bin (path_conv &pc, HANDLE &fh, ACCESS_MASK access) } NtClose (recyclerdir); /* Shoot again. */ - status = NtSetInformationFile (fh, &io, pfri, sizeof infobuf, + status = NtSetInformationFile (fh, &io, pfri, 65536, FileRenameInformation); } if (!NT_SUCCESS (status)) @@ -397,7 +395,7 @@ try_to_bin (path_conv &pc, HANDLE &fh, ACCESS_MASK access) status); goto out; } - status = NtSetInformationFile (tmp_fh, &io, pfri, sizeof infobuf, + status = NtSetInformationFile (tmp_fh, &io, pfri, 65536, FileRenameInformation); NtClose (tmp_fh); if (!NT_SUCCESS (status))