OSDN Git Service

* path.cc (path_conv::check): Don't follow reparse point symlinks if
authorcorinna <corinna>
Mon, 17 Jan 2011 14:19:39 +0000 (14:19 +0000)
committercorinna <corinna>
Mon, 17 Jan 2011 14:19:39 +0000 (14:19 +0000)
PC_SYM_NOFOLLOW_REP flag is set.
(cygwin_conv_path): Set PC_SYM_NOFOLLOW_REP flag when converting from
POSIX to Win32.
* path.h (enum pathconv_arg): Define PC_SYM_NOFOLLOW_REP flag.

winsup/cygwin/ChangeLog
winsup/cygwin/path.cc
winsup/cygwin/path.h

index 6c0b2a2..19417b2 100644 (file)
@@ -1,5 +1,13 @@
 2011-01-17  Corinna Vinschen  <corinna@vinschen.de>
 
+       * path.cc (path_conv::check): Don't follow reparse point symlinks if
+       PC_SYM_NOFOLLOW_REP flag is set.
+       (cygwin_conv_path): Set PC_SYM_NOFOLLOW_REP flag when converting from
+       POSIX to Win32.
+       * path.h (enum pathconv_arg): Define PC_SYM_NOFOLLOW_REP flag.
+
+2011-01-17  Corinna Vinschen  <corinna@vinschen.de>
+
        * fhandler_proc.cc (proc_tab_cmp): Fix typo in comment.
        (fhandler_proc::fill_filebuf): Handle return value of 0 from format
        function as error.
index ff3e3f0..cb38a25 100644 (file)
@@ -1,7 +1,7 @@
 /* path.cc: path support.
 
      Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
-     2006, 2007, 2008, 2009, 2010 Red Hat, Inc.
+     2006, 2007, 2008, 2009, 2010, 2011 Red Hat, Inc.
 
   This file is part of Cygwin.
 
@@ -920,7 +920,9 @@ is_virtual_symlink:
          else if (symlen > 0)
            {
              saw_symlinks = 1;
-             if (component == 0 && !need_directory && !(opt & PC_SYM_FOLLOW))
+             if (component == 0 && !need_directory
+                 && (!(opt & PC_SYM_FOLLOW)
+                     || (is_rep_symlink () && (opt & PC_SYM_NOFOLLOW_REP))))
                {
                  set_symlink (symlen); // last component of path is a symlink.
                  if (opt & PC_SYM_CONTENTS)
@@ -2917,8 +2919,8 @@ cygwin_conv_path (cygwin_conv_path_t what, const void *from, void *to,
     case CCP_POSIX_TO_WIN_A:
       {
        p.check ((const char *) from,
-                PC_POSIX | PC_SYM_FOLLOW | PC_NO_ACCESS_CHECK | PC_NOWARN
-                | (relative ? PC_NOFULL : 0));
+                PC_POSIX | PC_SYM_FOLLOW | PC_SYM_NOFOLLOW_REP
+                | PC_NO_ACCESS_CHECK | PC_NOWARN | (relative ? PC_NOFULL : 0));
        if (p.error)
          return_with_errno (p.error);
        PUNICODE_STRING up = p.get_nt_native_path ();
@@ -2953,9 +2955,9 @@ cygwin_conv_path (cygwin_conv_path_t what, const void *from, void *to,
       }
       break;
     case CCP_POSIX_TO_WIN_W:
-      p.check ((const char *) from, PC_POSIX | PC_SYM_FOLLOW
-                                   | PC_NO_ACCESS_CHECK | PC_NOWARN
-                                   | (relative ? PC_NOFULL : 0));
+      p.check ((const char *) from,
+              PC_POSIX | PC_SYM_FOLLOW | PC_SYM_NOFOLLOW_REP
+              | PC_NO_ACCESS_CHECK | PC_NOWARN | (relative ? PC_NOFULL : 0));
       if (p.error)
        return_with_errno (p.error);
       /* Relative Windows paths are always restricted to MAX_PATH chars. */
index ef6cac4..1b38078 100644 (file)
@@ -1,7 +1,7 @@
 /* path.h: path data structures
 
    Copyright 1996, 1997, 1998, 2000, 2001, 2002, 2003, 2004, 2005,
-   2006, 2007, 2008, 2009, 2010 Red Hat, Inc.
+   2006, 2007, 2008, 2009, 2010, 2011 Red Hat, Inc.
 
 This file is part of Cygwin.
 
@@ -54,6 +54,7 @@ enum pathconv_arg
 {
   PC_SYM_FOLLOW                = 0x0001,
   PC_SYM_NOFOLLOW      = 0x0002,
+  PC_SYM_NOFOLLOW_REP  = 0x0004,
   PC_SYM_CONTENTS      = 0x0008,
   PC_NOFULL            = 0x0010,
   PC_NULLEMPTY         = 0x0020,