aboutsummaryrefslogtreecommitdiff
path: root/libarchive/archive_write_disk_windows.c
diff options
context:
space:
mode:
Diffstat (limited to 'libarchive/archive_write_disk_windows.c')
-rw-r--r--libarchive/archive_write_disk_windows.c36
1 files changed, 28 insertions, 8 deletions
diff --git a/libarchive/archive_write_disk_windows.c b/libarchive/archive_write_disk_windows.c
index c9f10a8ae793..c7339c4ec1b1 100644
--- a/libarchive/archive_write_disk_windows.c
+++ b/libarchive/archive_write_disk_windows.c
@@ -408,7 +408,11 @@ permissive_name_w(struct archive_write_disk *a)
wn = _wcsdup(wnp);
if (wn == NULL)
return (-1);
- archive_wstring_ensure(&(a->_name_data), 4 + wcslen(wn) + 1);
+ if (archive_wstring_ensure(&(a->_name_data),
+ 4 + wcslen(wn) + 1) == NULL) {
+ free(wn);
+ return (-1);
+ }
a->name = a->_name_data.s;
/* Prepend "\\?\" */
archive_wstrncpy(&(a->_name_data), L"\\\\?\\", 4);
@@ -438,8 +442,11 @@ permissive_name_w(struct archive_write_disk *a)
wn = _wcsdup(wnp);
if (wn == NULL)
return (-1);
- archive_wstring_ensure(&(a->_name_data),
- 8 + wcslen(wn) + 1);
+ if (archive_wstring_ensure(&(a->_name_data),
+ 8 + wcslen(wn) + 1) == NULL) {
+ free(wn);
+ return (-1);
+ }
a->name = a->_name_data.s;
/* Prepend "\\?\UNC\" */
archive_wstrncpy(&(a->_name_data),
@@ -471,10 +478,16 @@ permissive_name_w(struct archive_write_disk *a)
*/
if (wnp[0] == L'\\') {
wn = _wcsdup(wnp);
- if (wn == NULL)
+ if (wn == NULL) {
+ free(wsp);
+ return (-1);
+ }
+ if (archive_wstring_ensure(&(a->_name_data),
+ 4 + 2 + wcslen(wn) + 1) == NULL) {
+ free(wsp);
+ free(wn);
return (-1);
- archive_wstring_ensure(&(a->_name_data),
- 4 + 2 + wcslen(wn) + 1);
+ }
a->name = a->_name_data.s;
/* Prepend "\\?\" and drive name. */
archive_wstrncpy(&(a->_name_data), L"\\\\?\\", 4);
@@ -486,9 +499,16 @@ permissive_name_w(struct archive_write_disk *a)
}
wn = _wcsdup(wnp);
- if (wn == NULL)
+ if (wn == NULL) {
+ free(wsp);
return (-1);
- archive_wstring_ensure(&(a->_name_data), 4 + l + 1 + wcslen(wn) + 1);
+ }
+ if (archive_wstring_ensure(&(a->_name_data),
+ 4 + l + 1 + wcslen(wn) + 1) == NULL) {
+ free(wsp);
+ free(wn);
+ return (-1);
+ }
a->name = a->_name_data.s;
/* Prepend "\\?\" and drive name if not already added. */
if (l > 3 && wsp[0] == L'\\' && wsp[1] == L'\\' &&