Disallow deleting extra fields by index in central & local dir at same time.
diff --git a/lib/zip_extra_field.c b/lib/zip_extra_field.c
index 41fd2b1..8f1ccaa 100644
--- a/lib/zip_extra_field.c
+++ b/lib/zip_extra_field.c
@@ -78,7 +78,7 @@
head = ef;
prev = NULL;
for (; ef; ef=(prev ? prev->next : head)) {
- if ((ef->flags & flags & ZIP_EF_BOTH) && ef->id == id) {
+ if ((ef->flags & flags & ZIP_EF_BOTH) && ((ef->id == id) || (id == ZIP_EXTRA_FIELD_ALL))) {
if (id_idx == ZIP_EXTRA_FIELD_ALL || i == id_idx) {
ef->flags &= ~(flags & ZIP_EF_BOTH);
if ((ef->flags & ZIP_EF_BOTH) == 0) {
diff --git a/lib/zip_extra_field_api.c b/lib/zip_extra_field_api.c
index 02ed455..3e936d2 100644
--- a/lib/zip_extra_field_api.c
+++ b/lib/zip_extra_field_api.c
@@ -46,6 +46,11 @@
_zip_error_set(&za->error, ZIP_ER_INVAL, 0);
return -1;
}
+
+ if (((flags & ZIP_EF_BOTH) == ZIP_EF_BOTH) && (ef_idx != ZIP_EXTRA_FIELD_ALL)) {
+ _zip_error_set(&za->error, ZIP_ER_INVAL, 0);
+ return -1;
+ }
if (_zip_get_dirent(za, idx, 0, NULL) == NULL)
return -1;
@@ -75,6 +80,11 @@
_zip_error_set(&za->error, ZIP_ER_INVAL, 0);
return -1;
}
+
+ if (((flags & ZIP_EF_BOTH) == ZIP_EF_BOTH) && (ef_idx != ZIP_EXTRA_FIELD_ALL)) {
+ _zip_error_set(&za->error, ZIP_ER_INVAL, 0);
+ return -1;
+ }
if (_zip_get_dirent(za, idx, 0, NULL) == NULL)
return -1;