Fix extra field modification functions (clone extra fields before modifying).
Check return value of _zip_dirent_clone().
diff --git a/lib/zip_file_replace.c b/lib/zip_file_replace.c
index a73a261..cc1b72a 100644
--- a/lib/zip_file_replace.c
+++ b/lib/zip_file_replace.c
@@ -93,11 +93,15 @@
_zip_unchange_data(za->entry+idx);
if (za->entry[idx].orig != NULL && (za->entry[idx].changes == NULL || (za->entry[idx].changes->changed & ZIP_DIRENT_COMP_METHOD) == 0)) {
- if (za->entry[idx].changes == NULL)
- za->entry[idx].changes = _zip_dirent_clone(za->entry[idx].orig);
+ if (za->entry[idx].changes == NULL) {
+ if ((za->entry[idx].changes=_zip_dirent_clone(za->entry[idx].orig)) == NULL) {
+ _zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
+ return -1;
+ }
+ }
- za->entry[idx].changes->comp_method = ZIP_CM_REPLACED_DEFAULT;
- za->entry[idx].changes->changed |= ZIP_DIRENT_COMP_METHOD;
+ za->entry[idx].changes->comp_method = ZIP_CM_REPLACED_DEFAULT;
+ za->entry[idx].changes->changed |= ZIP_DIRENT_COMP_METHOD;
}
za->entry[idx].source = source;