[PATCH v2] fix build on systems without memrchr(3)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Op 22-06-2024 om 15:25 schreef Martijn Dekker:
memrchr(3) is non-standard, and has been ported from glibc to FreeBSD, NetSBD and OpenBSD, but not to macOS, at least as of 12.7.5. So we need a test for it. As far as I can tell, *name is a zero-terminated C string, so it should work to use strrchr(3) as a fallback.

Reading the code more closely, that's nonsense, because 'p' does not point to the end of the string if metacharacters are found.

Guess the best we can do is provide a simple local fallback implementation of memrchr(3). Patch v2 attached.

--
||	modernish -- harness the shell
||	https://github.com/modernish/modernish
||
||	KornShell lives!
||	https://github.com/ksh93/ksh
diff --git a/configure.ac b/configure.ac
index 338d5bd..ba4856a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -87,7 +87,7 @@ AC_CHECK_DECL([PRIdMAX],,
 
 dnl Checks for library functions.
 AC_CHECK_FUNCS(bsearch faccessat getpwnam getrlimit isalpha killpg \
-	       memfd_create mempcpy \
+	       memfd_create memrchr mempcpy \
 	       sigsetmask stpcpy strchrnul strsignal strtod strtoimax \
 	       strtoumax sysconf tee)
 
diff --git a/src/expand.c b/src/expand.c
index 6912e39..e3056a0 100644
--- a/src/expand.c
+++ b/src/expand.c
@@ -1633,6 +1633,17 @@ static char *expmeta_rmescapes(char *enddir, const char *name)
 	return enddir - 1;
 }
 
+#ifndef HAVE_MEMRCHR
+static void *memrchr(const void *s, int c, size_t n)
+{
+	const unsigned char *str = (const unsigned char *)s;
+	for (const unsigned char *cp = str + n - 1; cp >= str; cp--)
+		if (*cp == c)
+			return (void *)cp;
+	return NULL;
+}
+#endif
+
 /*
  * Do metacharacter (i.e. *, ?, [...]) expansion.
  */

[Index of Archives]     [LARTC]     [Bugtraq]     [Yosemite Forum]     [Photo]

  Powered by Linux