diff options
Diffstat (limited to 'ext/zip/lib')
| -rw-r--r-- | ext/zip/lib/zip_close.c | 6 | ||||
| -rw-r--r-- | ext/zip/lib/zip_dirent.c | 12 | 
2 files changed, 14 insertions, 4 deletions
| diff --git a/ext/zip/lib/zip_close.c b/ext/zip/lib/zip_close.c index 362f92d749..e66c56697b 100644 --- a/ext/zip/lib/zip_close.c +++ b/ext/zip/lib/zip_close.c @@ -88,6 +88,9 @@ zip_close(struct zip *za)      if (za == NULL)  	return -1; +    if (za->zp == NULL) +        return -1; +      if (!_zip_changed(za, &survivors)) {  	_zip_free(za);  	return 0; @@ -164,9 +167,10 @@ zip_close(struct zip *za)      for (j=0; j<survivors; j++) {  	i = filelist[j].idx; +	_zip_dirent_init(&de); +  	/* create new local directory entry */  	if (ZIP_ENTRY_DATA_CHANGED(za->entry+i) || new_torrentzip) { -	    _zip_dirent_init(&de);  	    if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0))  		_zip_dirent_torrent_normalize(&de); diff --git a/ext/zip/lib/zip_dirent.c b/ext/zip/lib/zip_dirent.c index b5b9d273be..b9dac5c989 100644 --- a/ext/zip/lib/zip_dirent.c +++ b/ext/zip/lib/zip_dirent.c @@ -157,11 +157,17 @@ _zip_cdir_write(struct zip_cdir *cd, FILE *fp, struct zip_error *error)  void  _zip_dirent_finalize(struct zip_dirent *zde)  { -    free(zde->filename); +    if (zde->filename_len > 0) { +        free(zde->filename); +    }      zde->filename = NULL; -    free(zde->extrafield); +    if (zde->extrafield_len > 0) { +        free(zde->extrafield); +    }      zde->extrafield = NULL; -    free(zde->comment); +    if (zde->comment_len > 0) { +        free(zde->comment); +    }      zde->comment = NULL;  } | 
