From 164a90521397ab75e6c57b96e2ec4f7a732de6a9 Mon Sep 17 00:00:00 2001 From: Daniel Shahaf Date: Sat, 21 Mar 2020 18:06:48 +0000 Subject: [PATCH 3/8] chrealpath: Let caller decide how the return value should be allocated. --- Src/hist.c | 11 +++++++---- Src/subst.c | 4 ++-- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/Src/hist.c b/Src/hist.c index db2cc4ad7..8ab7828e8 100644 --- a/Src/hist.c +++ b/Src/hist.c @@ -842,7 +842,7 @@ histsubchar(int c) break; case 'A': - if (!chrealpath(&sline, 'A')) { + if (!chrealpath(&sline, 'A', 1)) { herrflush(); zerr("modifier failed: A"); return -1; @@ -1928,12 +1928,14 @@ chabspath(char **junkptr) * If mode is 'A', resolve dot-dot before symlinks. Else, mode should be 'P'. * Refer to the documentation of the :A and :P modifiers for details. * + * use_heap is 1 if the result is to be allocated on the heap, 0 otherwise. + * * Return 0 for error, non-zero for success. */ /**/ int -chrealpath(char **junkptr, char mode) +chrealpath(char **junkptr, char mode, int use_heap) { char *str; #ifdef HAVE_REALPATH @@ -2000,14 +2002,15 @@ chrealpath(char **junkptr, char mode) str++; } + use_heap = (use_heap ? META_HEAPDUP : META_DUP); if (real) { - *junkptr = metafy(str = bicat(real, nonreal), -1, META_HEAPDUP); + *junkptr = metafy(str = bicat(real, nonreal), -1, use_heap); zsfree(str); #ifdef REALPATH_ACCEPTS_NULL free(real); #endif } else { - *junkptr = metafy(nonreal, lastpos - nonreal + 1, META_HEAPDUP); + *junkptr = metafy(nonreal, lastpos - nonreal + 1, use_heap); } #endif diff --git a/Src/subst.c b/Src/subst.c index 7b3222d6e..94ddb9ceb 100644 --- a/Src/subst.c +++ b/Src/subst.c @@ -4399,7 +4399,7 @@ modify(char **str, char **ptr, int inbrace) chabspath(©); break; case 'A': - chrealpath(©, 'A'); + chrealpath(©, 'A', 1); break; case 'c': { @@ -4485,7 +4485,7 @@ modify(char **str, char **ptr, int inbrace) chabspath(str); break; case 'A': - chrealpath(str, 'A'); + chrealpath(str, 'A', 1); break; case 'c': {