summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog3
-rw-r--r--Src/utils.c14
-rw-r--r--Test/B13whence.ztst2
-rw-r--r--configure.ac1
4 files changed, 18 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index cd370cb09..6e7f96f41 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
2025-05-14 Daniel Shahaf <d.s@daniel.shahaf.name>
+ * 53607: Src/utils.c, Test/B13whence.ztst: Stop printing
+ /usr/bin/foo -> /usr/bin/foo in 'whence -s'.
+
* 53524 (cf. 53607): Test/B13whence.ztst: Add an XFAIL test for a
'whence -s' bug involving non-symlink arguments.
diff --git a/Src/utils.c b/Src/utils.c
index 19fd61a8b..4ea7b8e93 100644
--- a/Src/utils.c
+++ b/Src/utils.c
@@ -1003,11 +1003,23 @@ print_if_link(char *s, int all)
}
}
} else {
- if (chrealpath(&s, 'P', 0)) {
+#ifdef HAVE_MEMCCPY
+ char s_at_entry[PATH_MAX+1];
+ if (!memccpy(s_at_entry, s, '\0', sizeof(s_at_entry))) {
+ DPUTS1(1, "path longer than PATH_MAX: %s", s);
+ s_at_entry[PATH_MAX] = '\0';
+ }
+#else /* HAVE_MEMCCPY */
+ char *s_at_entry = ztrdup(s);
+#endif /* HAVE_MEMCCPY */
+ if (chrealpath(&s, 'P', 0) && strcmp(s, s_at_entry)) {
printf(" -> ");
zputs(*s ? s : "/", stdout);
zsfree(s);
}
+#ifndef HAVE_MEMCCPY
+ zsfree(s_at_entry);
+#endif /* !HAVE_MEMCCPY */
}
}
}
diff --git a/Test/B13whence.ztst b/Test/B13whence.ztst
index e455d38ae..5132c2c04 100644
--- a/Test/B13whence.ztst
+++ b/Test/B13whence.ztst
@@ -34,5 +34,5 @@
1:whence deals with symlink loops gracefully
whence -s =sh(:P) | grep '.->' | wc -l
--fD:(workers/53524) whence -s doesn't print arrows for symlink-free paths
+0:(workers/53524) whence -s doesn't print arrows for symlink-free paths
>0
diff --git a/configure.ac b/configure.ac
index ab368c9a7..13895bb1d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1261,6 +1261,7 @@ AC_CHECK_FUNCS(strftime strptime mktime timelocal \
initgroups \
setuid seteuid setreuid setresuid setsid \
setgid setegid setregid setresgid \
+ memccpy \
memcpy memmove strstr strerror strtoul \
getrlimit getrusage \
setlocale \