summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcus Boerger <helly@php.net>2003-10-25 14:06:29 +0000
committerMarcus Boerger <helly@php.net>2003-10-25 14:06:29 +0000
commitee0f709e4bdb88f445534578698e11714b06c619 (patch)
tree58866427ff7ae5c69c1b2853cee96ce57a4f80fc
parentc4b163de889605fa333a4eaf67ef165872b342ad (diff)
downloadphp-git-ee0f709e4bdb88f445534578698e11714b06c619.tar.gz
- Fixed bug #25581 (getimagesize () return incorrect values on bitmap
(os2) files)
-rw-r--r--NEWS2
-rw-r--r--ext/standard/image.c23
2 files changed, 19 insertions, 6 deletions
diff --git a/NEWS b/NEWS
index 89f8977433..1eef0aa7d8 100644
--- a/NEWS
+++ b/NEWS
@@ -43,6 +43,8 @@ PHP NEWS
(Sterling)
- Fixed visibility of __construct and __clone. (Marcus)
- Fixed bug #25756 (SimpleXML's validate_schema_file() broken). (Moriyoshi)
+- Fixed bug #25581 (getimagesize () return incorrect values on bitmap (os2)
+ files) (Marcus)
- Fixed bug #25494 (array_merge*() allows non-arrays as argument). (Jay)
- Fixed bug #24766 (strange result array from unpack()). (Moriyoshi)
- Fixed bug #24729 ($obj = new $className; causes crash when $className is not
diff --git a/ext/standard/image.c b/ext/standard/image.c
index 366cfe2982..fede26f657 100644
--- a/ext/standard/image.c
+++ b/ext/standard/image.c
@@ -143,18 +143,29 @@ static struct gfxinfo *php_handle_psd (php_stream * stream TSRMLS_DC)
static struct gfxinfo *php_handle_bmp (php_stream * stream TSRMLS_DC)
{
struct gfxinfo *result = NULL;
- unsigned char dim[12];
+ unsigned char dim[16];
+ int size;
- if (php_stream_seek(stream, 15, SEEK_CUR))
+ if (php_stream_seek(stream, 11, SEEK_CUR))
return NULL;
if (php_stream_read(stream, dim, sizeof(dim)) != sizeof(dim))
return NULL;
- result = (struct gfxinfo *) ecalloc (1, sizeof(struct gfxinfo));
- result->width = (((unsigned int)dim[ 3]) << 24) + (((unsigned int)dim[ 2]) << 16) + (((unsigned int)dim[ 1]) << 8) + ((unsigned int) dim[ 0]);
- result->height = (((unsigned int)dim[ 7]) << 24) + (((unsigned int)dim[ 6]) << 16) + (((unsigned int)dim[ 5]) << 8) + ((unsigned int) dim[ 4]);
- result->bits = (((unsigned int)dim[11]) << 8) + ((unsigned int)dim[10]);
+ size = (((unsigned int)dim[ 3]) << 24) + (((unsigned int)dim[ 2]) << 16) + (((unsigned int)dim[ 1]) << 8) + ((unsigned int) dim[ 0]);
+ if (size == 12) {
+ result = (struct gfxinfo *) ecalloc (1, sizeof(struct gfxinfo));
+ result->width = (((unsigned int)dim[ 5]) << 8) + ((unsigned int) dim[ 4]);
+ result->height = (((unsigned int)dim[ 7]) << 8) + ((unsigned int) dim[ 6]);
+ result->bits = ((unsigned int)dim[11]);
+ } else if (size > 12 && (size <= 64 || size == 108)) {
+ result = (struct gfxinfo *) ecalloc (1, sizeof(struct gfxinfo));
+ result->width = (((unsigned int)dim[ 7]) << 24) + (((unsigned int)dim[ 6]) << 16) + (((unsigned int)dim[ 5]) << 8) + ((unsigned int) dim[ 4]);
+ result->height = (((unsigned int)dim[11]) << 24) + (((unsigned int)dim[10]) << 16) + (((unsigned int)dim[ 9]) << 8) + ((unsigned int) dim[ 8]);
+ result->bits = (((unsigned int)dim[15]) << 8) + ((unsigned int)dim[14]);
+ } else {
+ return NULL;
+ }
return result;
}