mirror of
https://github.com/php/php-src.git
synced 2025-08-18 23:18:56 +02:00
fix PHP bug #48791: open office files always reported as corrupted
This commit is contained in:
parent
03133b0df2
commit
651f5c0cef
2 changed files with 21 additions and 0 deletions
|
@ -2407,6 +2407,7 @@ int phar_postprocess_file(phar_entry_data *idata, php_uint32 crc32, char **error
|
||||||
if (entry->is_zip && process_zip > 0) {
|
if (entry->is_zip && process_zip > 0) {
|
||||||
/* verify local file header */
|
/* verify local file header */
|
||||||
phar_zip_file_header local;
|
phar_zip_file_header local;
|
||||||
|
phar_zip_data_desc desc;
|
||||||
|
|
||||||
if (SUCCESS != phar_open_archive_fp(idata->phar TSRMLS_CC)) {
|
if (SUCCESS != phar_open_archive_fp(idata->phar TSRMLS_CC)) {
|
||||||
spprintf(error, 0, "phar error: unable to open zip-based phar archive \"%s\" to verify local file header for file \"%s\"", idata->phar->fname, entry->filename);
|
spprintf(error, 0, "phar error: unable to open zip-based phar archive \"%s\" to verify local file header for file \"%s\"", idata->phar->fname, entry->filename);
|
||||||
|
@ -2420,6 +2421,25 @@ int phar_postprocess_file(phar_entry_data *idata, php_uint32 crc32, char **error
|
||||||
return FAILURE;
|
return FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* check for data descriptor */
|
||||||
|
if (((PHAR_ZIP_16(local.flags)) & 0x8) == 0x8) {
|
||||||
|
php_stream_seek(phar_get_entrypfp(idata->internal_file TSRMLS_CC),
|
||||||
|
entry->header_offset + sizeof(local) +
|
||||||
|
PHAR_ZIP_16(local.filename_len) +
|
||||||
|
PHAR_ZIP_16(local.extra_len) +
|
||||||
|
entry->compressed_filesize, SEEK_SET);
|
||||||
|
if (sizeof(desc) != php_stream_read(phar_get_entrypfp(idata->internal_file TSRMLS_CC),
|
||||||
|
(char *) &desc, sizeof(desc))) {
|
||||||
|
spprintf(error, 0, "phar error: internal corruption of zip-based phar \"%s\" (cannot read local data descriptor for file \"%s\")", idata->phar->fname, entry->filename);
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
if (desc.signature[0] == 'P' && desc.signature[1] == 'K') {
|
||||||
|
memcpy(&(local.crc32), &(desc.crc32), 12);
|
||||||
|
} else {
|
||||||
|
/* old data descriptors have no signature */
|
||||||
|
memcpy(&(local.crc32), &desc, 12);
|
||||||
|
}
|
||||||
|
}
|
||||||
/* verify local header */
|
/* verify local header */
|
||||||
if (entry->filename_len != PHAR_ZIP_16(local.filename_len) || entry->crc32 != PHAR_ZIP_32(local.crc32) || entry->uncompressed_filesize != PHAR_ZIP_32(local.uncompsize) || entry->compressed_filesize != PHAR_ZIP_32(local.compsize)) {
|
if (entry->filename_len != PHAR_ZIP_16(local.filename_len) || entry->crc32 != PHAR_ZIP_32(local.crc32) || entry->uncompressed_filesize != PHAR_ZIP_32(local.uncompsize) || entry->compressed_filesize != PHAR_ZIP_32(local.compsize)) {
|
||||||
spprintf(error, 0, "phar error: internal corruption of zip-based phar \"%s\" (local header of file \"%s\" does not match central directory)", idata->phar->fname, entry->filename);
|
spprintf(error, 0, "phar error: internal corruption of zip-based phar \"%s\" (local header of file \"%s\" does not match central directory)", idata->phar->fname, entry->filename);
|
||||||
|
|
|
@ -37,6 +37,7 @@ typedef struct _phar_zip_file_header {
|
||||||
|
|
||||||
/* unused in this release */
|
/* unused in this release */
|
||||||
typedef struct _phar_zip_file_datadesc {
|
typedef struct _phar_zip_file_datadesc {
|
||||||
|
char signature[4]; /* signature (optional) 4 bytes */
|
||||||
char crc32[4]; /* crc-32 4 bytes */
|
char crc32[4]; /* crc-32 4 bytes */
|
||||||
char compsize[4]; /* compressed size 4 bytes */
|
char compsize[4]; /* compressed size 4 bytes */
|
||||||
char uncompsize[4]; /* uncompressed size 4 bytes */
|
char uncompsize[4]; /* uncompressed size 4 bytes */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue