]> granicus.if.org Git - php/commitdiff
fix creation of phar from scratch, add test case
authorGreg Beaver <cellog@php.net>
Fri, 5 Jan 2007 03:04:56 +0000 (03:04 +0000)
committerGreg Beaver <cellog@php.net>
Fri, 5 Jan 2007 03:04:56 +0000 (03:04 +0000)
ext/phar/phar.c
ext/phar/tests/create_new_phar.phpt [new file with mode: 0644]

index 9c444c4bb7afd7940f272954a75d3c59b74244f6..63d8b7371f7814f85f1bde1f0c1f17a13735922c 100644 (file)
@@ -1425,7 +1425,7 @@ static size_t phar_write(php_stream *stream, const char *buf, size_t count TSRML
        data->internal_file->uncompressed_filesize += count;
        data->internal_file->compressed_filesize = data->internal_file->uncompressed_filesize; 
        data->internal_file->flags |= PHAR_ENT_MODIFIED;
-       return 0;
+       return count;
 }
 /* }}} */
 
@@ -1499,6 +1499,14 @@ static int phar_flush(php_stream *stream TSRMLS_DC) /* {{{ */
                        php_stream_close(newfile);
                        php_error_docref(NULL TSRMLS_CC, E_RECOVERABLE_ERROR, "unable to copy prologue of old phar to new phar \"%s\"", data->phar->fname);
                }
+       } else {
+               /* this is a brand new phar */
+               data->phar->halt_offset = sizeof("<?php __HALT_COMPILER(); ?>");
+               if (sizeof("<?php __HALT_COMPILER(); ?>") != php_stream_write(newfile, "<?php __HALT_COMPILER(); ?>" ,sizeof("<?php __HALT_COMPILER(); ?>"))) {
+                       php_stream_close(data->fp);
+                       php_stream_close(newfile);
+                       php_error_docref(NULL TSRMLS_CC, E_RECOVERABLE_ERROR, "unable to create prologue in new phar \"%s\"", data->phar->fname);
+               }
        }
        manifest_ftell = php_stream_tell(newfile);
        buffer = (char *) emalloc(300);
@@ -1771,15 +1779,17 @@ static int phar_flush(php_stream *stream TSRMLS_DC) /* {{{ */
                php_stream_close(data->fp);
                php_error_docref(NULL TSRMLS_CC, E_RECOVERABLE_ERROR, "unable to seek to __HALT_COMPILER(); in new phar \"%s\"", data->phar->fname);
        }
-       
-       php_stream_close(data->fp);
+
+       if (data->fp) {
+               php_stream_close(data->fp);
+       }
        data->fp = 0;
        if (data->phar->fp) {
                /* we will re-open this later */
                php_stream_close(data->phar->fp);
                data->phar->fp = 0;
        }
-       
+
        fname = estrndup(data->phar->fname, data->phar->fname_len);
        fname_len = data->phar->fname_len;
        alias = estrndup(data->phar->alias, data->phar->alias_len);
diff --git a/ext/phar/tests/create_new_phar.phpt b/ext/phar/tests/create_new_phar.phpt
new file mode 100644 (file)
index 0000000..8b58aa8
--- /dev/null
@@ -0,0 +1,18 @@
+--TEST--
+Phar: create a completely new phar
+--SKIPIF--
+<?php if (!extension_loaded("phar")) print "skip"; ?>
+--FILE--
+<?php
+
+file_put_contents('phar://' . dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar.php/a.php',
+       'brand new!');
+include 'phar://' . dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar.php/a.php';
+?>
+
+===DONE===
+--CLEAN--
+<?php unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.php'); ?>
+--EXPECT--
+brand new!
+===DONE===