From d162b9052941bb418641884614d22eda64167ea0 Mon Sep 17 00:00:00 2001 From: Julien Finet Date: Wed, 8 Jun 2016 16:39:52 +0200 Subject: [PATCH] Do not preppend \\?\ if it is already there If GetCurrentDirectory() returns \\?\C\a\path or \\?\UNC\server\a\path, then adding \\?\ would not work. --- libarchive/archive_write_disk_windows.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/libarchive/archive_write_disk_windows.c b/libarchive/archive_write_disk_windows.c index 800aa893f..da76c54db 100644 --- a/libarchive/archive_write_disk_windows.c +++ b/libarchive/archive_write_disk_windows.c @@ -468,9 +468,17 @@ permissive_name_w(struct archive_write_disk *a) return (-1); archive_wstring_ensure(&(a->_name_data), 4 + l + 1 + wcslen(wn) + 1); a->name = a->_name_data.s; - /* Prepend "\\?\" and drive name. */ - archive_wstrncpy(&(a->_name_data), L"\\\\?\\", 4); - archive_wstrncat(&(a->_name_data), wsp, l); + /* Prepend "\\?\" and drive name if not already added. */ + if (l > 3 && wsp[0] == L'\\' && wsp[1] == L'\\' && + wsp[2] == L'?' && wsp[3] == L'\\') + { + archive_wstrncpy(&(a->_name_data), wsp, l); + } + else + { + archive_wstrncpy(&(a->_name_data), L"\\\\?\\", 4); + archive_wstrncat(&(a->_name_data), wsp, l); + } archive_wstrncat(&(a->_name_data), L"\\", 1); archive_wstrcat(&(a->_name_data), wn); a->name = a->_name_data.s; -- 2.47.2