diff options
author | Jay Satiro <raysatiro@yahoo.com> | 2016-02-09 03:28:58 -0500 |
---|---|---|
committer | Jay Satiro <raysatiro@yahoo.com> | 2016-02-09 03:28:58 -0500 |
commit | 4fc80f3e75c1e3ca2c3ff12ca9f9885720d5ce99 (patch) | |
tree | f56d79cc9a3b8658b5f04ed7c0c53dd1fd985e16 | |
parent | 6b64d735cd7ec453fabbc07a1913bdb8e6ec0a65 (diff) |
tool_doswin: Support for literal path prefix \\?\
For example something like --output \\?\C:\foo
-rw-r--r-- | src/tool_doswin.c | 15 | ||||
-rw-r--r-- | tests/unit/unit1604.c | 19 |
2 files changed, 30 insertions, 4 deletions
diff --git a/src/tool_doswin.c b/src/tool_doswin.c index 8650427ca..aed657a6a 100644 --- a/src/tool_doswin.c +++ b/src/tool_doswin.c @@ -150,9 +150,8 @@ SANITIZEcode sanitize_file_name(char **const sanitized, const char *file_name, if((flags & SANITIZE_ALLOW_PATH)) { #ifndef MSDOS - if((flags & SANITIZE_ALLOW_PATH) && - file_name[0] == '\\' && file_name[1] == '\\') - /* UNC prefixed path, eg \\?\C:\foo */ + if(file_name[0] == '\\' && file_name[1] == '\\') + /* UNC prefixed path \\ (eg \\?\C:\foo) */ max_sanitized_len = 32767-1; else #endif @@ -180,8 +179,16 @@ SANITIZEcode sanitize_file_name(char **const sanitized, const char *file_name, strncpy(target, file_name, len); target[len] = '\0'; +#ifndef MSDOS + if((flags & SANITIZE_ALLOW_PATH) && !strncmp(target, "\\\\?\\", 4)) + /* Skip the literal path prefix \\?\ */ + p = target + 4; + else +#endif + p = target; + /* replace control characters and other banned characters */ - for(p = target; *p; ++p) { + for(; *p; ++p) { const char *banned; if((1 <= *p && *p <= 31) || diff --git a/tests/unit/unit1604.c b/tests/unit/unit1604.c index b48785902..c61f010dc 100644 --- a/tests/unit/unit1604.c +++ b/tests/unit/unit1604.c @@ -110,6 +110,14 @@ UNITTEST_START { "f:/foo", SANITIZE_ALLOW_PATH, "f:/foo", SANITIZE_ERR_OK }, +#ifndef MSDOS + { "\\\\?\\C:\\foo", SANITIZE_ALLOW_PATH, + "\\\\?\\C:\\foo", SANITIZE_ERR_OK + }, + { "\\\\?\\C:\\foo", 0, + "____C__foo", SANITIZE_ERR_OK + }, +#endif { "foo:bar", 0, "foo_bar", SANITIZE_ERR_OK }, @@ -164,6 +172,17 @@ UNITTEST_START { "com1:\\com1", SANITIZE_ALLOW_RESERVED, "com1__com1", SANITIZE_ERR_OK }, +#ifndef MSDOS + { "\\com1", SANITIZE_ALLOW_PATH, + "\\_com1", SANITIZE_ERR_OK + }, + { "\\\\com1", SANITIZE_ALLOW_PATH, + "\\\\com1", SANITIZE_ERR_OK + }, + { "\\\\?\\C:\\com1", SANITIZE_ALLOW_PATH, + "\\\\?\\C:\\com1", SANITIZE_ERR_OK + }, +#endif { "CoM1", 0, "_CoM1", SANITIZE_ERR_OK }, |