summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/zip/lib/zip_fclose.c14
-rw-r--r--ext/zip/php_zip.c11
2 files changed, 17 insertions, 8 deletions
diff --git a/ext/zip/lib/zip_fclose.c b/ext/zip/lib/zip_fclose.c
index cf4f35c71c..c0105a9290 100644
--- a/ext/zip/lib/zip_fclose.c
+++ b/ext/zip/lib/zip_fclose.c
@@ -52,13 +52,15 @@ zip_fclose(struct zip_file *zf)
free(zf->buffer);
free(zf->zstr);
- for (i=0; i<zf->za->nfile; i++) {
- if (zf->za->file[i] == zf) {
- zf->za->file[i] = zf->za->file[zf->za->nfile-1];
- zf->za->nfile--;
- break;
+ if (zf->za) {
+ for (i=0; i<zf->za->nfile; i++) {
+ if (zf->za->file[i] == zf) {
+ zf->za->file[i] = zf->za->file[zf->za->nfile-1];
+ zf->za->nfile--;
+ break;
+ }
+ }
}
- }
ret = 0;
if (zf->error.zip_err)
diff --git a/ext/zip/php_zip.c b/ext/zip/php_zip.c
index d77bdb6787..03c13ddc78 100644
--- a/ext/zip/php_zip.c
+++ b/ext/zip/php_zip.c
@@ -551,6 +551,7 @@ static void php_zip_free_dir(zend_rsrc_list_entry *rsrc TSRMLS_DC)
if (zip_int) {
if (zip_int->za) {
zip_close(zip_int->za);
+ zip_int->za = NULL;
}
efree(rsrc->ptr);
@@ -565,8 +566,14 @@ static void php_zip_free_entry(zend_rsrc_list_entry *rsrc TSRMLS_DC)
{
zip_read_rsrc *zr_rsrc = (zip_read_rsrc *) rsrc->ptr;
- efree(zr_rsrc);
- rsrc->ptr = NULL;
+ if (zr_rsrc) {
+ if (zr_rsrc->zf) {
+ zip_fclose(zr_rsrc->zf);
+ zr_rsrc->zf = NULL;
+ }
+ efree(zr_rsrc);
+ rsrc->ptr = NULL;
+ }
}
/* }}} */