]> granicus.if.org Git - php/commitdiff
fix a few memleaks and double-free()s on error conditions
authorNuno Lopes <nlopess@php.net>
Sat, 6 Jan 2007 20:16:25 +0000 (20:16 +0000)
committerNuno Lopes <nlopess@php.net>
Sat, 6 Jan 2007 20:16:25 +0000 (20:16 +0000)
ext/zip/php_zip.c

index cfacdec74a1eacdd819b21abf44f947a34ad8ed7..21291c01333c3ba48775b171a997f453987d09af 100644 (file)
@@ -551,7 +551,9 @@ 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);
+                       if (zip_close(zip_int->za) != 0) {
+                               _zip_free(zip_int->za);
+                       }
                        zip_int->za = NULL;
                }
 
@@ -906,16 +908,20 @@ static ZIPARCHIVE_METHOD(open)
 
        if (ze_obj->za) {
                /* we already have an opened zip, free it */
-               zip_close(ze_obj->za);
+               if (zip_close(ze_obj->za) != 0) {
+                       _zip_free(ze_obj->za);
+               }
+               ze_obj->za = NULL;
        }
        if (ze_obj->filename) {
                efree(ze_obj->filename);
+               ze_obj->filename = NULL;
        }
        intern = zip_open(resolved_path, flags, &err);
        if (!intern || err) {
                RETURN_LONG((long)err);
        }
-       ze_obj->filename = estrndup(resolved_path, strlen(resolved_path));
+       ze_obj->filename = estrdup(resolved_path);
        ze_obj->filename_len = filename_len;
        ze_obj->za = intern;
        RETURN_TRUE;