Consistently remove internally handled extra fields.
diff --git a/lib/zip_extra_field.c b/lib/zip_extra_field.c
index d4bc77f..9b9e399 100644
--- a/lib/zip_extra_field.c
+++ b/lib/zip_extra_field.c
@@ -255,6 +255,35 @@
+struct zip_extra_field *
+_zip_ef_remove_internal(struct zip_extra_field *ef)
+{
+ struct zip_extra_field *ef_head;
+ struct zip_extra_field *prev, *next;
+
+ ef_head = prev = ef;
+
+ while (ef) {
+ if (ZIP_EF_IS_INTERNAL(ef->id)) {
+ next = ef->next;
+ if (ef_head == ef)
+ ef_head = next;
+ ef->next = NULL;
+ _zip_ef_free(ef);
+ if (prev)
+ prev->next = next;
+ ef = next;
+ }
+ else {
+ prev = ef;
+ ef = ef->next;
+ }
+ }
+
+ return ef_head;
+}
+
+
zip_uint16_t
_zip_ef_size(struct zip_extra_field *ef, zip_flags_t flags)
{
@@ -339,7 +368,7 @@
}
free(ef_raw);
- /* XXX: remove fields handled internally (Zip64, UTF-8) */
+ ef = _zip_ef_remove_internal(ef);
e->orig->extra_fields = _zip_ef_merge(e->orig->extra_fields, ef);
}