]> granicus.if.org Git - php/commitdiff
MFB: fix all remaining big-endian issues
authorGreg Beaver <cellog@php.net>
Sun, 15 Feb 2009 20:29:26 +0000 (20:29 +0000)
committerGreg Beaver <cellog@php.net>
Sun, 15 Feb 2009 20:29:26 +0000 (20:29 +0000)
ext/phar/phar.c
ext/phar/zip.c

index 177ab8f32f9e64c3d46bd25ad86628b0bf4a7042..788648855ec98f1e250c37cf18d544588bdd51a6 100644 (file)
@@ -510,12 +510,19 @@ void phar_entry_remove(phar_entry_data *idata, char **error TSRMLS_DC) /* {{{ */
        var = ((((unsigned char*)(buffer))[1]) <<  8) \
                | (((unsigned char*)(buffer))[0]); \
        (buffer) += 2
-# define PHAR_ZIP_32(buffer) ((((unsigned char*)(buffer))[3]) << 24) \
-               | ((((unsigned char*)(buffer))[2]) << 16) \
-               | ((((unsigned char*)(buffer))[1]) <<  8) \
-               | (((unsigned char*)(buffer))[0])
-# define PHAR_ZIP_16(buffer) ((((unsigned char*)(buffer))[1]) <<  8) \
-               | (((unsigned char*)(buffer))[0])
+static inline php_uint32 phar_fix_32(php_uint32 buffer)
+{
+       return ((((unsigned char *)&buffer)[3]) << 24) |
+               ((((unsigned char *)&buffer)[2]) << 16) |
+               ((((unsigned char *)&buffer)[1]) << 8) |
+               (((unsigned char *)&buffer)[0]);
+}
+static inline php_uint16 phar_fix_16(php_uint16 buffer)
+{
+       return ((((unsigned char *)&buffer)[1]) << 8) | ((unsigned char *)&buffer)[0];
+}
+# define PHAR_ZIP_32(buffer) phar_fix_32((php_uint32)(buffer))
+# define PHAR_ZIP_16(buffer) phar_fix_16((php_uint16)(buffer))
 #else
 # define PHAR_GET_32(buffer, var) \
        var = *(php_uint32*)(buffer); \
index 358bef872697c32829e848c8f517168f08192592..0beed2ecdef303e0cb8c37ef32f4fd424dcef0b3 100644 (file)
@@ -383,7 +383,7 @@ foundit:
                        php_stream_seek(fp, loc + PHAR_GET_16(zipentry.extra_len), SEEK_SET);
                }
 
-               switch (zipentry.compressed) {
+               switch (PHAR_GET_16(zipentry.compressed)) {
                        case PHAR_ZIP_COMP_NONE :
                                /* compression flag already set */
                                break;
@@ -450,7 +450,7 @@ foundit:
                        }
 
                        p = buf;
-                       entry.metadata_len = zipentry.comment_len;
+                       entry.metadata_len = PHAR_GET_16(zipentry.comment_len);
 
                        if (phar_parse_metadata(&p, &(entry.metadata), PHAR_GET_16(zipentry.comment_len) TSRMLS_CC) == FAILURE) {
                                entry.metadata_len = 0;
@@ -997,6 +997,7 @@ int phar_zip_flush(phar_archive_data *phar, char *user_stub, long len, int defau
        char *temperr = NULL;
        struct _phar_zip_pass pass;
        phar_zip_dir_end eocd;
+       php_uint32 cdir_size, cdir_offset;
 
        pass.error = &temperr;
        entry.flags = PHAR_ENT_PERM_DEF_FILE;
@@ -1198,7 +1199,7 @@ fperror:
        memset(&eocd, 0, sizeof(eocd));
 
        strncpy(eocd.signature, "PK\5\6", 4);
-       eocd.counthere = eocd.count = zend_hash_num_elements(&phar->manifest);
+       eocd.counthere = eocd.count = PHAR_GET_16(zend_hash_num_elements(&phar->manifest));
        zend_hash_apply_with_argument(&phar->manifest, phar_zip_changed_apply, (void *) &pass TSRMLS_CC);
 
        if (temperr) {
@@ -1217,11 +1218,13 @@ nocentralerror:
        }
 
        /* save zip */
-       eocd.cdir_size = php_stream_tell(pass.centralfp);
-       eocd.cdir_offset = php_stream_tell(pass.filefp);
+       cdir_size = php_stream_tell(pass.centralfp);
+       cdir_offset = php_stream_tell(pass.filefp);
+       eocd.cdir_size = PHAR_SET_32(cdir_size);
+       eocd.cdir_offset = PHAR_SET_32(cdir_offset);
        php_stream_seek(pass.centralfp, 0, SEEK_SET);
 
-       if (eocd.cdir_size != php_stream_copy_to_stream(pass.centralfp, pass.filefp, PHP_STREAM_COPY_ALL)) {
+       if (cdir_size != php_stream_copy_to_stream(pass.centralfp, pass.filefp, PHP_STREAM_COPY_ALL)) {
                if (error) {
                        spprintf(error, 4096, "phar zip flush of \"%s\" failed: unable to write central-directory", phar->fname);
                }