]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
Detect `..` in Paths Correctly
authorW. Felix Handte <w@felixhandte.com>
Fri, 26 Feb 2021 17:29:42 +0000 (12:29 -0500)
committerW. Felix Handte <w@felixhandte.com>
Fri, 26 Feb 2021 17:29:42 +0000 (12:29 -0500)
This commit addresses #2509.

programs/util.c

index 7208d66d28b99877b540d06b11a38e5b4fc23dcf..3fd4cd17e662f4f05736442e65c8cfd18b9239d8 100644 (file)
@@ -679,7 +679,27 @@ const char* UTIL_getFileExtension(const char* infilename)
 
 static int pathnameHas2Dots(const char *pathname)
 {
-    return NULL != strstr(pathname, "..");
+    /* We need to figure out whether any ".." present in the path is a whole
+     * path token, which is the case if it is bordered on both sides by either
+     * the beginning/end of the path or by a directory separator.
+     */
+    const char *needle = pathname;
+    while (1) {
+        needle = strstr(needle, "..");
+
+        if (needle == NULL) {
+            return 0;
+        }
+
+        if ((needle == pathname || needle[-1] == PATH_SEP)
+         && (needle[2] == '\0' || needle[2] == PATH_SEP)) {
+            return 1;
+        }
+
+        /* increment so we search for the next match */
+        needle++;
+    };
+    return 0;
 }
 
 static int isFileNameValidForMirroredOutput(const char *filename)