diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2011-01-17 14:19:39 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2011-01-17 14:19:39 +0000 |
commit | be371651146ca13155181a801d785cca77acbacb (patch) | |
tree | 8e000d64590e0ae140528b7f0c6182132fa0c447 /winsup/cygwin/path.cc | |
parent | 483e9d0022a7327e5ce47d3fb6c0e8c1f16fe2fc (diff) | |
download | cygnal-be371651146ca13155181a801d785cca77acbacb.tar.gz cygnal-be371651146ca13155181a801d785cca77acbacb.tar.bz2 cygnal-be371651146ca13155181a801d785cca77acbacb.zip |
* 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.
Diffstat (limited to 'winsup/cygwin/path.cc')
-rw-r--r-- | winsup/cygwin/path.cc | 16 |
1 files changed, 9 insertions, 7 deletions
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. */ |