]> granicus.if.org Git - php/commitdiff
fix leaks within zip entries in several tests
authorNuno Lopes <nlopess@php.net>
Sat, 11 Nov 2006 23:43:00 +0000 (23:43 +0000)
committerNuno Lopes <nlopess@php.net>
Sat, 11 Nov 2006 23:43:00 +0000 (23:43 +0000)
ext/zip/lib/zip_fclose.c
ext/zip/php_zip.c

index cf4f35c71c3ad12be6745b5916df16c51ad75964..c0105a92907415f5df6f8ee34d21337626cd7d03 100644 (file)
@@ -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)
index d77bdb6787b1ea5a42ce4c66f59ace4a6e23297a..03c13ddc782383af51905e2e21eed50e7a333329 100644 (file)
@@ -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;
+       }
 }
 /* }}} */