diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index a49f03e65..c4284bdac 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,10 @@ +2010-08-18 Corinna Vinschen + + * exceptions.cc (open_stackdumpfile): Don't try to open file if we + have no filesystem based CWD. Add comment. + * path.cc (cwdstuff::set): Set CWD handle to NULL if CWD is a virtual + path. Simplify matching comment. + 2010-08-18 Corinna Vinschen * fhandler_disk_file.cc (fhandler_base::fstat_helper): Set st_rdev diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc index a2afa5e0f..e904ff188 100644 --- a/winsup/cygwin/exceptions.cc +++ b/winsup/cygwin/exceptions.cc @@ -128,7 +128,10 @@ error_start_init (const char *buf) static void open_stackdumpfile () { - if (myself->progname[0]) + /* If we have no executable name, or if the CWD handle is NULL, + which means, the CWD is a virtual path, don't even try to open + a stackdump file. */ + if (myself->progname[0] && cygheap->cwd.get_handle ()) { const WCHAR *p; /* write to progname.stackdump if possible */ diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc index ee7d186eb..00a9c1d65 100644 --- a/winsup/cygwin/path.cc +++ b/winsup/cygwin/path.cc @@ -3321,9 +3321,9 @@ cwdstuff::set (path_conv *nat_cwd, const char *posix_cwd) /* Open a directory handle with FILE_OPEN_FOR_BACKUP_INTENT and with all sharing flags set. The handle is right now used in exceptions.cc only, but that might change in future. */ + HANDLE h = NULL; if (!virtual_path) { - HANDLE h; NTSTATUS status; IO_STATUS_BLOCK io; OBJECT_ATTRIBUTES attr; @@ -3363,18 +3363,11 @@ cwdstuff::set (path_conv *nat_cwd, const char *posix_cwd) __seterrno_from_nt_status (status); return -1; } - /* Note that we don't set the dir handle to NULL for virtual paths. - The handle is used to generate a stackdump file. Since we can't - create a stackdump in a virtual path, we have at least *some* - directory handle to generate the stackdump in. - - However, note that we have to make sure that we don't use the handle - wrongly as soon as we start to use it in other cases as well. */ - HANDLE old_dir = dir; - dir = h; - if (old_dir) - NtClose (old_dir); } + /* Set new handle. It's only used when creating stackdumps so far. */ + if (dir) + NtClose (dir); + dir = h; if (!nat_cwd) {