@@ -4311,70 +4311,63 @@ static void exif_isobmff_parse_meta(unsigned char *data, unsigned char *end, iso
4311
4311
unsigned char * box_offset , * p , * p2 ;
4312
4312
int header_size , exif_id = -1 , version , item_count , i ;
4313
4313
4314
- for (box_offset = data + 4 ; box_offset + 16 < end ; box_offset += box .size ) {
4314
+ size_t remain ;
4315
+ #define CHECK (n ) do { \
4316
+ if (remain < (n)) { \
4317
+ return; \
4318
+ } \
4319
+ } while (0)
4320
+ #define ADVANCE (n ) do { \
4321
+ CHECK(n); \
4322
+ remain -= (n); \
4323
+ p += (n); \
4324
+ } while (0)
4325
+
4326
+ for (box_offset = data + 4 ; box_offset < end - 16 ; box_offset += box .size ) {
4315
4327
header_size = exif_isobmff_parse_box (box_offset , & box );
4316
4328
if (box .size < header_size ) {
4317
4329
return ;
4318
4330
}
4331
+ p = box_offset ;
4332
+ remain = end - p ;
4333
+
4319
4334
if (box .type == FOURCC ("iinf" )) {
4320
- p = box_offset + header_size ;
4321
- if (p >= end ) {
4322
- return ;
4323
- }
4324
- version = p [0 ];
4325
- p += 4 ;
4335
+ ADVANCE (header_size + 4 );
4336
+ version = p [-4 ];
4326
4337
if (version < 2 ) {
4327
- if (p + 2 >= end ) {
4328
- return ;
4329
- }
4330
- item_count = php_ifd_get16u (p , 1 );
4331
- p += 2 ;
4338
+ ADVANCE (2 );
4339
+ item_count = php_ifd_get16u (p - 2 , 1 );
4332
4340
} else {
4333
- if (p + 4 >= end ) {
4334
- return ;
4335
- }
4336
- item_count = php_ifd_get32u (p , 1 );
4337
- p += 4 ;
4341
+ ADVANCE (4 );
4342
+ item_count = php_ifd_get32u (p - 4 , 1 );
4338
4343
}
4339
- for (i = 0 ; i < item_count && p + 20 < end ; i ++ ) {
4344
+ for (i = 0 ; i < item_count && p < end - 20 ; i ++ ) {
4340
4345
header_size = exif_isobmff_parse_box (p , & item );
4341
4346
if (item .size < header_size ) {
4342
4347
return ;
4343
4348
}
4344
- if (p + header_size + 12 >= end ) {
4345
- return ;
4346
- }
4349
+ CHECK (header_size + 12 );
4347
4350
if (!memcmp (p + header_size + 8 , "Exif" , 4 )) {
4348
4351
exif_id = php_ifd_get16u (p + header_size + 4 , 1 );
4349
4352
break ;
4350
4353
}
4351
- p += item .size ;
4354
+ ADVANCE ( item .size ) ;
4352
4355
}
4353
4356
if (exif_id < 0 ) {
4354
4357
break ;
4355
4358
}
4356
4359
}
4357
4360
else if (box .type == FOURCC ("iloc" )) {
4358
- p = box_offset + header_size ;
4359
- if (p >= end ) {
4360
- return ;
4361
- }
4362
- version = p [0 ];
4363
- p += 6 ;
4361
+ ADVANCE (header_size + 6 );
4362
+ version = p [-6 ];
4364
4363
if (version < 2 ) {
4365
- if (p + 2 >= end ) {
4366
- return ;
4367
- }
4368
- item_count = php_ifd_get16u (p , 1 );
4369
- p += 2 ;
4364
+ ADVANCE (2 );
4365
+ item_count = php_ifd_get16u (p - 2 , 1 );
4370
4366
} else {
4371
- if (p + 4 >= end ) {
4372
- return ;
4373
- }
4374
- item_count = php_ifd_get32u (p , 1 );
4375
- p += 4 ;
4367
+ ADVANCE (4 );
4368
+ item_count = php_ifd_get32u (p - 4 , 1 );
4376
4369
}
4377
- for (i = 0 , p2 = p ; i < item_count && p + 16 < end ; i ++ , p2 += 16 ) {
4370
+ for (i = 0 , p2 = p ; i < item_count && p < end - 16 ; i ++ , p2 += 16 ) {
4378
4371
if (php_ifd_get16u (p2 , 1 ) == exif_id ) {
4379
4372
pos -> offset = php_ifd_get32u (p2 + 8 , 1 );
4380
4373
pos -> size = php_ifd_get32u (p2 + 12 , 1 );
@@ -4384,6 +4377,9 @@ static void exif_isobmff_parse_meta(unsigned char *data, unsigned char *end, iso
4384
4377
break ;
4385
4378
}
4386
4379
}
4380
+
4381
+ #undef ADVANCE
4382
+ #undef CHECK
4387
4383
}
4388
4384
4389
4385
static bool exif_scan_HEIF_header (image_info_type * ImageInfo , unsigned char * buf )
0 commit comments