]> granicus.if.org Git - php/commitdiff
Merge branch 'PHP-7.4'
authorChristoph M. Becker <cmbecker69@gmx.de>
Tue, 28 Jan 2020 09:40:00 +0000 (10:40 +0100)
committerChristoph M. Becker <cmbecker69@gmx.de>
Tue, 28 Jan 2020 09:40:00 +0000 (10:40 +0100)
* PHP-7.4:
  Fix #76584: PharFileInfo::decompress not working

1  2 
ext/phar/phar_object.c

index 8a4599d5f439770f7023977665f310099bc66488,6cf097e36fe46b372ddc86c0a769c394d110fd86..027c78a18c9e46a81683591cbdf82ed3414b0fc0
@@@ -5108,12 -5093,24 +5109,24 @@@ PHP_METHOD(PharFileInfo, decompress
                /* re-populate after copy-on-write */
                entry_obj->entry = zend_hash_str_find_ptr(&phar->manifest, entry_obj->entry->filename, entry_obj->entry->filename_len);
        }
-       if (!entry_obj->entry->fp) {
-               if (FAILURE == phar_open_archive_fp(entry_obj->entry->phar)) {
-                       zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "Cannot decompress entry \"%s\", phar error: Cannot open phar archive \"%s\" for reading", entry_obj->entry->filename, entry_obj->entry->phar->fname);
+       switch (entry_obj->entry->flags & PHAR_ENT_COMPRESSION_MASK) {
+               case PHAR_ENT_COMPRESSED_GZ:
+                       compression_type = "gzip";
+                       break;
+               case PHAR_ENT_COMPRESSED_BZ2:
+                       compression_type = "bz2";
+                       break;
+               default:
+                       zend_throw_exception_ex(spl_ce_BadMethodCallException, 0,
+                               "Cannot decompress file compressed with unknown compression type");
 -                      return;
 +                      RETURN_THROWS();
-               }
-               entry_obj->entry->fp_type = PHAR_FP;
+       }
+       /* decompress this file indirectly */
+       if (SUCCESS != phar_open_entry_fp(entry_obj->entry, &error, 1)) {
+               zend_throw_exception_ex(spl_ce_BadMethodCallException, 0,
+                       "Phar error: Cannot decompress %s-compressed file \"%s\" in phar \"%s\": %s", compression_type, entry_obj->entry->filename, entry_obj->entry->phar->fname, error);
+               efree(error);
+               return;
        }
  
        entry_obj->entry->old_flags = entry_obj->entry->flags;