Index: winsup/cygwin/fhandler_disk_file.cc =================================================================== RCS file: /cvs/src/src/winsup/cygwin/fhandler_disk_file.cc,v retrieving revision 1.90 diff -u -p -r1.90 fhandler_disk_file.cc --- winsup/cygwin/fhandler_disk_file.cc 20 Apr 2004 15:51:24 -0000 1.90 +++ winsup/cygwin/fhandler_disk_file.cc 17 May 2004 16:41:30 -0000 @@ -159,6 +159,20 @@ fhandler_base::fstat_by_name (struct __s int __stdcall fhandler_base::fstat_fs (struct __stat64 *buf) { + // If this is a Win32 pipe name, don't attempt to open the file + if (is_win32_pipe_name (get_win32_name ())) + { + debug_printf("Circumventing this function for Win32 pipe"); + buf->st_mode = S_IFCHR | STD_RBITS | STD_WBITS | S_IWGRP | S_IWOTH; + buf->st_uid = geteuid32 (); + buf->st_gid = getegid32 (); + buf->st_nlink = 1; + buf->st_blksize = S_BLKSIZE; + time_as_timestruc_t (&buf->st_ctim); + buf->st_atim = buf->st_mtim = buf->st_ctim; + return 0; + } + int res = -1; int oret; int open_flags = O_RDONLY | O_BINARY; Index: winsup/cygwin/path.cc =================================================================== RCS file: /cvs/src/src/winsup/cygwin/path.cc,v retrieving revision 1.312 diff -u -p -r1.312 path.cc --- winsup/cygwin/path.cc 15 May 2004 15:55:43 -0000 1.312 +++ winsup/cygwin/path.cc 17 May 2004 16:41:44 -0000 @@ -137,6 +137,20 @@ create_shortcut_header (void) #define isvirtual_dev(devn) \ (devn == FH_CYGDRIVE || devn == FH_PROC || devn == FH_REGISTRY || devn == FH_PROCESS) +// Win32 pipe names have a prefix that follows the pattern: "\\\\[^\\]+\\pipe\\" +bool +is_win32_pipe_name (const char * const s) +{ + if (strncmp(s, "\\\\", 2)) + return false; + const char * const p = strchr(s + 2, '\\'); + if (!p || p - s == 2) + return false; + if (strnicmp(p + 1, "pipe\\", 5)) + return false; + return true; +} + /* Return non-zero if PATH1 is a prefix of PATH2. Both are assumed to be of the same path style and / vs \ usage. Neither may be "". @@ -3020,6 +3034,17 @@ symlink_info::check (char *path, const s pflags &= ~(PATH_SYMLINK | PATH_LNK); case_clash = false; + + // Calling GetFileAttributes on a Win32 pipe path will cause undefined behavior. + // Since Win32 pipe paths cannot contain symlinks, this function is just skipped. + if (is_win32_pipe_name (path)) + { + debug_printf("Circumventing this function for Win32 pipe"); + error = 0; + is_symlink = false; + fileattr = FILE_ATTRIBUTE_DEVICE; + return 0; + } while (suffix.next ()) { Index: winsup/cygwin/path.h =================================================================== RCS file: /cvs/src/src/winsup/cygwin/path.h,v retrieving revision 1.65 diff -u -p -r1.65 path.h --- winsup/cygwin/path.h 11 May 2004 15:39:50 -0000 1.65 +++ winsup/cygwin/path.h 17 May 2004 16:41:45 -0000 @@ -271,6 +271,8 @@ bool fnunmunge (char *, const char *) __ int path_prefix_p (const char *path1, const char *path2, int len1) __attribute__ ((regparm (3))); +bool is_win32_pipe_name (const char * const s); + /* FIXME: Move to own include file eventually */ #define MAX_ETC_FILES 2