summaryrefslogtreecommitdiff
path: root/ext/zip/lib/zip_unchange.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/zip/lib/zip_unchange.c')
-rw-r--r--ext/zip/lib/zip_unchange.c29
1 files changed, 9 insertions, 20 deletions
diff --git a/ext/zip/lib/zip_unchange.c b/ext/zip/lib/zip_unchange.c
index 550e8b9903..5f0e753b78 100644
--- a/ext/zip/lib/zip_unchange.c
+++ b/ext/zip/lib/zip_unchange.c
@@ -39,7 +39,7 @@
-ZIP_EXTERN(int)
+ZIP_EXTERN int
zip_unchange(struct zip *za, zip_uint64_t idx)
{
return _zip_unchange(za, idx, 0);
@@ -50,34 +50,23 @@ zip_unchange(struct zip *za, zip_uint64_t idx)
int
_zip_unchange(struct zip *za, zip_uint64_t idx, int allow_duplicates)
{
- int i;
+ zip_int64_t i;
if (idx >= za->nentry) {
_zip_error_set(&za->error, ZIP_ER_INVAL, 0);
return -1;
}
- if (za->entry[idx].ch_filename) {
- if (!allow_duplicates) {
- i = _zip_name_locate(za,
- _zip_get_name(za, idx, ZIP_FL_UNCHANGED, NULL),
- 0, NULL);
- if (i != -1 && i != idx) {
- _zip_error_set(&za->error, ZIP_ER_EXISTS, 0);
- return -1;
- }
+ if (!allow_duplicates && za->entry[idx].changes && (za->entry[idx].changes->changed & ZIP_DIRENT_FILENAME)) {
+ i = _zip_name_locate(za, _zip_get_name(za, idx, ZIP_FL_UNCHANGED, NULL), 0, NULL);
+ if (i >= 0 && (zip_uint64_t)i != idx) {
+ _zip_error_set(&za->error, ZIP_ER_EXISTS, 0);
+ return -1;
}
-
- free(za->entry[idx].ch_filename);
- za->entry[idx].ch_filename = NULL;
}
- free(za->entry[idx].ch_extra);
- za->entry[idx].ch_extra = NULL;
- za->entry[idx].ch_extra_len = -1;
- free(za->entry[idx].ch_comment);
- za->entry[idx].ch_comment = NULL;
- za->entry[idx].ch_comment_len = -1;
+ _zip_dirent_free(za->entry[idx].changes);
+ za->entry[idx].changes = NULL;
_zip_unchange_data(za->entry+idx);