summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--winsup/cygwin/ChangeLog8
-rw-r--r--winsup/cygwin/path.cc16
-rw-r--r--winsup/cygwin/path.h3
3 files changed, 19 insertions, 8 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 6c0b2a2b2..19417b28e 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -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.
diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc
index ff3e3f034..cb38a25f1 100644
--- a/winsup/cygwin/path.cc
+++ b/winsup/cygwin/path.cc
@@ -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. */
diff --git a/winsup/cygwin/path.h b/winsup/cygwin/path.h
index ef6cac44e..1b3807809 100644
--- a/winsup/cygwin/path.h
+++ b/winsup/cygwin/path.h
@@ -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,