Skip to content

Commit 50b976d

Browse files
committed
ext/exif: Refactor implementation of exif_scan_FILE_header()
1 parent aa92c70 commit 50b976d

File tree

1 file changed

+51
-42
lines changed

1 file changed

+51
-42
lines changed

ext/exif/exif.c

+51-42
Original file line numberDiff line numberDiff line change
@@ -4278,63 +4278,72 @@ static bool exif_process_IFD_in_TIFF(image_info_type *ImageInfo, size_t dir_offs
42784278
static bool exif_scan_FILE_header(image_info_type *ImageInfo)
42794279
{
42804280
unsigned char file_header[8];
4281-
bool ret = false;
42824281

42834282
ImageInfo->FileType = IMAGE_FILETYPE_UNKNOWN;
42844283

4285-
if (ImageInfo->FileSize >= 2) {
4286-
php_stream_seek(ImageInfo->infile, 0, SEEK_SET);
4287-
if (exif_read_from_stream_file_looped(ImageInfo->infile, (char*)file_header, 2) != 2) {
4284+
if (UNEXPECTED(ImageInfo->FileSize < 2)) {
4285+
exif_error_docref(NULL EXIFERR_CC, ImageInfo, E_WARNING, "File too small (%d)", ImageInfo->FileSize);
4286+
return false;
4287+
}
4288+
4289+
php_stream_seek(ImageInfo->infile, 0, SEEK_SET);
4290+
if (exif_read_from_stream_file_looped(ImageInfo->infile, (char*)file_header, 2) != 2) {
4291+
return false;
4292+
}
4293+
4294+
if ((file_header[0]==0xff) && (file_header[1]==M_SOI)) {
4295+
ImageInfo->FileType = IMAGE_FILETYPE_JPEG;
4296+
if (exif_scan_JPEG_header(ImageInfo)) {
4297+
return true;
4298+
} else {
4299+
exif_error_docref(NULL EXIFERR_CC, ImageInfo, E_WARNING, "Invalid JPEG file");
4300+
return false;
4301+
}
4302+
} else if (ImageInfo->FileSize >= 8) {
4303+
if (exif_read_from_stream_file_looped(ImageInfo->infile, (char*)(file_header+2), 6) != 6) {
42884304
return false;
42894305
}
4290-
if ((file_header[0]==0xff) && (file_header[1]==M_SOI)) {
4291-
ImageInfo->FileType = IMAGE_FILETYPE_JPEG;
4292-
if (exif_scan_JPEG_header(ImageInfo)) {
4293-
ret = true;
4306+
4307+
if (!memcmp(file_header, "II\x2A\x00", 4)) {
4308+
ImageInfo->FileType = IMAGE_FILETYPE_TIFF_II;
4309+
ImageInfo->motorola_intel = 0;
4310+
#ifdef EXIF_DEBUG
4311+
exif_error_docref(NULL EXIFERR_CC, ImageInfo, E_NOTICE, "File has TIFF/II format");
4312+
#endif
4313+
ImageInfo->sections_found |= FOUND_IFD0;
4314+
if (exif_process_IFD_in_TIFF(
4315+
ImageInfo,
4316+
php_ifd_get32u(file_header + 4, ImageInfo->motorola_intel),
4317+
SECTION_IFD0
4318+
)) {
4319+
return true;
42944320
} else {
4295-
exif_error_docref(NULL EXIFERR_CC, ImageInfo, E_WARNING, "Invalid JPEG file");
4296-
}
4297-
} else if (ImageInfo->FileSize >= 8) {
4298-
if (exif_read_from_stream_file_looped(ImageInfo->infile, (char*)(file_header+2), 6) != 6) {
4321+
exif_error_docref(NULL EXIFERR_CC, ImageInfo, E_WARNING, "Invalid TIFF file");
42994322
return false;
43004323
}
4301-
if (!memcmp(file_header, "II\x2A\x00", 4)) {
4302-
ImageInfo->FileType = IMAGE_FILETYPE_TIFF_II;
4303-
ImageInfo->motorola_intel = 0;
4304-
#ifdef EXIF_DEBUG
4305-
exif_error_docref(NULL EXIFERR_CC, ImageInfo, E_NOTICE, "File has TIFF/II format");
4306-
#endif
4307-
ImageInfo->sections_found |= FOUND_IFD0;
4308-
if (exif_process_IFD_in_TIFF(ImageInfo,
4309-
php_ifd_get32u(file_header + 4, ImageInfo->motorola_intel),
4310-
SECTION_IFD0)) {
4311-
ret = true;
4312-
} else {
4313-
exif_error_docref(NULL EXIFERR_CC, ImageInfo, E_WARNING, "Invalid TIFF file");
4314-
}
4315-
} else if (!memcmp(file_header, "MM\x00\x2a", 4)) {
4316-
ImageInfo->FileType = IMAGE_FILETYPE_TIFF_MM;
4317-
ImageInfo->motorola_intel = 1;
4324+
} else if (!memcmp(file_header, "MM\x00\x2a", 4)) {
4325+
ImageInfo->FileType = IMAGE_FILETYPE_TIFF_MM;
4326+
ImageInfo->motorola_intel = 1;
43184327
#ifdef EXIF_DEBUG
4319-
exif_error_docref(NULL EXIFERR_CC, ImageInfo, E_NOTICE, "File has TIFF/MM format");
4328+
exif_error_docref(NULL EXIFERR_CC, ImageInfo, E_NOTICE, "File has TIFF/MM format");
43204329
#endif
4321-
ImageInfo->sections_found |= FOUND_IFD0;
4322-
if (exif_process_IFD_in_TIFF(ImageInfo,
4323-
php_ifd_get32u(file_header + 4, ImageInfo->motorola_intel),
4324-
SECTION_IFD0)) {
4325-
ret = true;
4326-
} else {
4327-
exif_error_docref(NULL EXIFERR_CC, ImageInfo, E_WARNING, "Invalid TIFF file");
4328-
}
4330+
ImageInfo->sections_found |= FOUND_IFD0;
4331+
if (exif_process_IFD_in_TIFF(
4332+
ImageInfo,
4333+
php_ifd_get32u(file_header + 4, ImageInfo->motorola_intel),
4334+
SECTION_IFD0
4335+
)) {
4336+
return true;
43294337
} else {
4330-
exif_error_docref(NULL EXIFERR_CC, ImageInfo, E_WARNING, "File not supported");
4338+
exif_error_docref(NULL EXIFERR_CC, ImageInfo, E_WARNING, "Invalid TIFF file");
43314339
return false;
43324340
}
4341+
} else {
4342+
exif_error_docref(NULL EXIFERR_CC, ImageInfo, E_WARNING, "File not supported");
4343+
return false;
43334344
}
4334-
} else {
4335-
exif_error_docref(NULL EXIFERR_CC, ImageInfo, E_WARNING, "File too small (%d)", ImageInfo->FileSize);
43364345
}
4337-
return ret;
4346+
return false;
43384347
}
43394348
/* }}} */
43404349

0 commit comments

Comments
 (0)