summaryrefslogtreecommitdiff
path: root/ext/standard/image.c
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 /ext/standard/image.c
parentc4b163de889605fa333a4eaf67ef165872b342ad (diff)
downloadphp-git-ee0f709e4bdb88f445534578698e11714b06c619.tar.gz
- Fixed bug #25581 (getimagesize () return incorrect values on bitmap
(os2) files)
Diffstat (limited to 'ext/standard/image.c')
-rw-r--r--ext/standard/image.c23
1 files changed, 17 insertions, 6 deletions
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;
}