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); \
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;
}
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;
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;
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) {
}
/* 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);
}