From 0e3bb2104a8e3fd07e201e6ba99f8d017fdc72a8 Mon Sep 17 00:00:00 2001 From: David Oberhollenzer Date: Tue, 29 Dec 2020 12:10:46 +0100 Subject: Fix normalization of slashes in filenames All paths were canonicalized internally, which includes filtering sequences of slashes and converting backslashes to slashes. Furthermore, when unpacking files, filenames are sanity checked and rejected if they contain forward OR backward slashes. This is a problem on Unix-like systems, where files containing backslashes are a legitimate use case (*cough* SystemD *cough*). This patch removes the backslash conversion from the canonicalization and modifies the sanity check to reject backslashes only on Windows. Signed-off-by: David Oberhollenzer --- tests/canonicalize_name.c | 10 +++++----- tests/filename_sane.c | 7 ++++--- 2 files changed, 9 insertions(+), 8 deletions(-) (limited to 'tests') diff --git a/tests/canonicalize_name.c b/tests/canonicalize_name.c index 679cd06..2ab73a0 100644 --- a/tests/canonicalize_name.c +++ b/tests/canonicalize_name.c @@ -14,14 +14,14 @@ static const struct { } must_work[] = { { "", "" }, { "/", "" }, - { "\\", "" }, + { "\\", "\\" }, { "///", "" }, - { "\\\\\\", "" }, - { "/\\//\\\\/", "" }, + { "\\\\\\", "\\\\\\" }, + { "/\\//\\\\/", "\\/\\\\" }, { "foo/bar/test", "foo/bar/test" }, - { "foo\\bar\\test", "foo/bar/test" }, + { "foo\\bar\\test", "foo\\bar\\test" }, { "/foo/bar/test/", "foo/bar/test" }, - { "\\foo\\bar\\test\\", "foo/bar/test" }, + { "\\foo\\bar\\test\\", "\\foo\\bar\\test\\" }, { "///foo//bar//test///", "foo/bar/test" }, { "./foo/././bar/test/./.", "foo/bar/test" }, { "./foo/././", "foo" }, diff --git a/tests/filename_sane.c b/tests/filename_sane.c index 3c1fd4f..86270b3 100644 --- a/tests/filename_sane.c +++ b/tests/filename_sane.c @@ -11,6 +11,9 @@ static const char *must_work[] = { "foobar", "test.txt", +#if !defined(_WIN32) && !defined(__WINDOWS__) && !defined(TEST_WIN32) + "\\foo", "foo\\", "foo\\bar", +#endif NULL, }; @@ -18,16 +21,14 @@ static const char *must_not_work[] = { ".", "..", "/foo", - "\\foo", "foo/", - "foo\\", "foo/bar", - "foo\\bar", NULL, }; static const char *must_not_work_here[] = { #if defined(_WIN32) || defined(__WINDOWS__) || defined(TEST_WIN32) + "\\foo", "foo\\", "foo\\bar", "foo", "fo:o", "fo\"o", "fo|o", "fo?o", "fo*o", "fo\ro", "CON", "PRN", "AUX", "NUL", -- cgit v1.2.3