]> granicus.if.org Git - python/commitdiff
bpo-38322: Fix gotlandmark() of PC/getpathp.c (GH-16489)
authorVictor Stinner <vstinner@python.org>
Mon, 30 Sep 2019 12:49:34 +0000 (14:49 +0200)
committerGitHub <noreply@github.com>
Mon, 30 Sep 2019 12:49:34 +0000 (14:49 +0200)
Write the filename into a temporary buffer instead of reusing prefix.
The problem is that join() modifies prefix inplace. If prefix is not
normalized, join() can make prefix shorter and so gotlandmark()
does modify prefix instead of returning it unmodified.

PC/getpathp.c

index 8bac592aefdb06a6794587256559a83cce15ec40..04f24d986f667c0c7d73d5d8b13110dcadc5a295 100644 (file)
@@ -315,15 +315,13 @@ canonicalize(wchar_t *buffer, const wchar_t *path)
    'prefix' is null terminated in bounds.  join() ensures
    'landmark' can not overflow prefix if too long. */
 static int
-gotlandmark(wchar_t *prefix, const wchar_t *landmark)
+gotlandmark(const wchar_t *prefix, const wchar_t *landmark)
 {
-    int ok;
-    Py_ssize_t n = wcsnlen_s(prefix, MAXPATHLEN);
-
-    join(prefix, landmark);
-    ok = ismodule(prefix, FALSE);
-    prefix[n] = '\0';
-    return ok;
+    wchar_t filename[MAXPATHLEN+1];
+    memset(filename, 0, sizeof(filename));
+    wcscpy_s(filename, Py_ARRAY_LENGTH(filename), prefix);
+    join(filename, landmark);
+    return ismodule(filename, FALSE);
 }