summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog3
-rw-r--r--Src/hist.c11
-rw-r--r--Src/subst.c4
3 files changed, 12 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index d45fcc670..c6478935c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
2020-03-25 Daniel Shahaf <d.s@daniel.shahaf.name>
+ * 45583/0003: Src/hist.c, Src/subst.c: chrealpath: Let caller
+ decide how the return value should be allocated.
+
* 45583/0002: Src/hist.c, Src/subst.c: chrealpath: Make symlink
resolution optional.
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(&copy);
break;
case 'A':
- chrealpath(&copy, 'A');
+ chrealpath(&copy, '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':
{