@@ -1710,31 +1710,33 @@ static size_t double_to_size_t(double x) {
1710
1710
* Evaluate number, be it int, rational, or float from directory. */
1711
1711
static size_t exif_convert_any_to_int (void * value , int format , int motorola_intel )
1712
1712
{
1713
- int s_den ;
1714
- unsigned u_den ;
1715
-
1716
- switch (format ) {
1713
+ switch (format ) {
1717
1714
case TAG_FMT_SBYTE : return * (signed char * )value ;
1718
1715
case TAG_FMT_BYTE : return * (uchar * )value ;
1719
1716
1720
1717
case TAG_FMT_USHORT : return php_ifd_get16u (value , motorola_intel );
1721
1718
case TAG_FMT_ULONG : return php_ifd_get32u (value , motorola_intel );
1722
1719
1723
- case TAG_FMT_URATIONAL :
1724
- u_den = php_ifd_get32u (4 + (char * )value , motorola_intel );
1720
+ case TAG_FMT_URATIONAL : {
1721
+ unsigned u_den = php_ifd_get32u (4 + (char * )value , motorola_intel );
1725
1722
if (u_den == 0 ) {
1726
1723
return 0 ;
1727
1724
} else {
1728
1725
return php_ifd_get32u (value , motorola_intel ) / u_den ;
1729
1726
}
1727
+ }
1730
1728
1731
- case TAG_FMT_SRATIONAL :
1732
- s_den = php_ifd_get32s (4 + (char * )value , motorola_intel );
1729
+ case TAG_FMT_SRATIONAL : {
1730
+ int s_num = php_ifd_get32s (value , motorola_intel );
1731
+ int s_den = php_ifd_get32s (4 + (char * )value , motorola_intel );
1733
1732
if (s_den == 0 ) {
1734
1733
return 0 ;
1734
+ } else if (s_num == INT_MIN && s_den == -1 ) {
1735
+ return INT_MAX ;
1735
1736
} else {
1736
- return ( size_t )(( double ) php_ifd_get32s ( value , motorola_intel ) / s_den ) ;
1737
+ return s_num / s_den ;
1737
1738
}
1739
+ }
1738
1740
1739
1741
case TAG_FMT_SSHORT : return php_ifd_get16u (value , motorola_intel );
1740
1742
case TAG_FMT_SLONG : return php_ifd_get32s (value , motorola_intel );
@@ -3473,7 +3475,7 @@ static int exif_process_IFD_TAG(image_info_type *ImageInfo, char *dir_entry, con
3473
3475
3474
3476
case TAG_FOCALPLANE_RESOLUTION_UNIT :
3475
3477
REQUIRE_NON_EMPTY ();
3476
- switch (( int ) exif_convert_any_format (value_ptr , format , ImageInfo -> motorola_intel )) {
3478
+ switch ( exif_convert_any_to_int (value_ptr , format , ImageInfo -> motorola_intel )) {
3477
3479
case 1 : ImageInfo -> FocalplaneUnits = 25.4 ; break ; /* inch */
3478
3480
case 2 :
3479
3481
/* According to the information I was using, 2 measn meters.
0 commit comments