From be371651146ca13155181a801d785cca77acbacb Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Mon, 17 Jan 2011 14:19:39 +0000 Subject: [PATCH] * 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. --- winsup/cygwin/ChangeLog | 8 ++++++++ winsup/cygwin/path.cc | 16 +++++++++------- winsup/cygwin/path.h | 3 ++- 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,3 +1,11 @@ +2011-01-17 Corinna Vinschen + + * 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 * fhandler_proc.cc (proc_tab_cmp): Fix typo in comment. 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,