From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 23329 invoked by alias); 10 Jun 2016 17:43:09 -0000 Mailing-List: contact zsh-workers-help@zsh.org; run by ezmlm Precedence: bulk X-No-Archive: yes List-Id: Zsh Workers List List-Post: List-Help: X-Seq: 38650 Received: (qmail 24440 invoked from network); 10 Jun 2016 17:43:08 -0000 X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham autolearn_force=no version=3.4.1 From: Daniel Shahaf To: zsh-workers@zsh.org Subject: [PATCH 2/3] Fix the ':A' word modifier on paths with '..' components. Date: Fri, 10 Jun 2016 17:36:23 +0000 Message-Id: <1465580184-3095-2-git-send-email-danielsh@tarsus.local2> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1465580184-3095-1-git-send-email-danielsh@tarsus.local2> References: <1465580184-3095-1-git-send-email-danielsh@tarsus.local2> The fix is to stop calling chabspath() at the top of chrealpath(). Also remove an incorrect comment (passing a non-absolute path would have been fine because the chabspath() call would have made it absolute). --- This is an incompatible change; see the test and docs changes for details. Daniel Doc/Zsh/expn.yo | 6 ++++-- README | 9 +++++++++ Src/hist.c | 22 ++++++++++------------ Test/D02glob.ztst | 6 ++++++ 4 files changed, 29 insertions(+), 14 deletions(-) diff --git a/Doc/Zsh/expn.yo b/Doc/Zsh/expn.yo index c6e7b6f..50b8479 100644 --- a/Doc/Zsh/expn.yo +++ b/Doc/Zsh/expn.yo @@ -225,9 +225,11 @@ intervening directories do not exist. ) item(tt(A))( As `tt(a)', but also resolve use of symbolic links where possible. -Note that resolution of `tt(..)' occurs em(before) resolution of symbolic -links. This call is equivalent to tt(a) unless your system has the +This call is equivalent to tt(a) unless your system has the tt(realpath) system call (modern systems do). + +em(Note): In zsh 5.2 and earlier, resolution of `tt(..)' occurred em(before) +resolution of symbolic links. ) item(tt(c))( Resolve a command name into an absolute path by searching the command diff --git a/README b/README index d5343db..84bb6bc 100644 --- a/README +++ b/README @@ -79,6 +79,15 @@ Other aspects of EXIT trap handling have not changed --- there is still only one EXIT trap at any point in a programme, so it is not generally useful to combine POSIX and non-POSIX behaviour in the same script. +4) On systems that have the realpath(3) library function, the ':A' word +modifier now resolves symbolic links before '..' path components. This +could lead to different, but usually more desirable, results: the +tranformed value will now always identify the same directory entry as the +the pre-transformation value. + +The behaviour of 5.2 and older can be achieved by chaining modifiers: +':a:A'. + Incompatibilities between 5.0.8 and 5.2 --------------------------------------- diff --git a/Src/hist.c b/Src/hist.c index 5fc40bd..07f56b0 100644 --- a/Src/hist.c +++ b/Src/hist.c @@ -1837,8 +1837,8 @@ chabspath(char **junkptr) int chrealpath(char **junkptr) { - char *str; #ifdef HAVE_REALPATH + char *str; # ifdef REALPATH_ACCEPTS_NULL char *lastpos, *nonreal, *real; # else @@ -1850,19 +1850,17 @@ chrealpath(char **junkptr) if (!**junkptr) return 1; - /* Notice that this means ..'s are applied before symlinks are resolved! */ - if (!chabspath(junkptr)) - return 0; - #ifndef HAVE_REALPATH - return 1; + return chabspath(junkptr); #else - /* - * Notice that this means you cannot pass relative paths into this - * function! - */ - if (**junkptr != '/') + + if (**junkptr != '/') { + *junkptr = zhtricat(metafy(zgetcwd(), -1, META_HEAPDUP), "/", *junkptr); + } + if (**junkptr != '/') { + /* Can happen after 'rmdir $PWD; zsh' */ return 0; + } unmetafy(*junkptr, NULL); @@ -1909,9 +1907,9 @@ chrealpath(char **junkptr) } else { *junkptr = metafy(nonreal, lastpos - nonreal + 1, META_HEAPDUP); } -#endif return 1; +#endif } /**/ diff --git a/Test/D02glob.ztst b/Test/D02glob.ztst index 8618378..dc1a655 100644 --- a/Test/D02glob.ztst +++ b/Test/D02glob.ztst @@ -670,3 +670,9 @@ () { set -- ${PWD}/$^@; print -l -- $@:A } glob.tmp/nonexistent/foo/bar/baz 0:modifier ':A' doesn't require existence *>*/glob.tmp/nonexistent/foo/bar/baz + + ln -s dir3/subdir glob.tmp/link + () { print ${1:A} } glob.tmp/link/../../hello + rm glob.tmp/link +0:modifier ':A' resolves symlinks before '..' components +*>*glob.tmp/hello