From c72205b28b93ee546027ad5297ba1771f31256a6 Mon Sep 17 00:00:00 2001 From: Jouke Witteveen Date: Sat, 26 Oct 2019 12:24:29 +0200 Subject: [PATCH] * src/implicit.c (pattern_search): Set lastslash correctly If filename contained multiple slashes lastslash is wrongly set to 0. * configure.ac: Check for the GNU memrchr() extension function. * src/misc.c (memrchr): Supply memrchr() if not available. --- configure.ac | 2 +- src/implicit.c | 8 +++----- src/misc.c | 24 ++++++++++++++++++++++++ 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/configure.ac b/configure.ac index e12a5b83..af58c1b4 100644 --- a/configure.ac +++ b/configure.ac @@ -138,7 +138,7 @@ AS_IF([test "$ac_cv_func_gettimeofday" = yes], [Define to 1 if you have a standard gettimeofday function]) ]) -AC_CHECK_FUNCS([strdup strndup umask mkstemp mktemp fdopen \ +AC_CHECK_FUNCS([strdup strndup memrchr umask mkstemp mktemp fdopen \ dup dup2 getcwd realpath sigsetmask sigaction \ getgroups seteuid setegid setlinebuf setreuid setregid \ getrlimit setrlimit setvbuf pipe strsignal \ diff --git a/src/implicit.c b/src/implicit.c index 7bdc8baf..cd707b28 100644 --- a/src/implicit.c +++ b/src/implicit.c @@ -265,7 +265,7 @@ pattern_search (struct file *file, int archive, /* Set LASTSLASH to point at the last slash in FILENAME but not counting any slash at the end. (foo/bar/ counts as bar/ in directory foo/, not empty in directory foo/bar/.) */ - lastslash = strrchr (filename, '/'); + lastslash = memrchr (filename, '/', namelen - 1); #ifdef VMS if (lastslash == NULL) lastslash = strrchr (filename, ']'); @@ -278,18 +278,16 @@ pattern_search (struct file *file, int archive, /* Handle backslashes (possibly mixed with forward slashes) and the case of "d:file". */ { - char *bslash = strrchr (filename, '\\'); + char *bslash = memrchr (filename, '\\', namelen - 1); if (lastslash == 0 || bslash > lastslash) lastslash = bslash; if (lastslash == 0 && filename[0] && filename[1] == ':') lastslash = filename + 1; } #endif - if (lastslash != 0 && lastslash[1] == '\0') - lastslash = 0; } - pathlen = lastslash - filename + 1; + pathlen = lastslash ? lastslash - filename + 1 : 0; /* First see which pattern rules match this target and may be considered. Put them in TRYRULES. */ diff --git a/src/misc.c b/src/misc.c index 567c86f9..2b7cc12a 100644 --- a/src/misc.c +++ b/src/misc.c @@ -260,6 +260,30 @@ xstrndup (const char *str, size_t length) return result; } + +#ifndef HAVE_MEMRCHR +void * +memrchr(const void* str, int ch, size_t len) +{ + const char* sp = str; + const char* cp = sp; + + if (len == 0) + return NULL; + + cp += len - 1; + + while (cp[0] != ch) + { + if (cp == sp) + return NULL; + --cp; + } + + return (void*)cp; +} +#endif + /* Limited INDEX: