@@ -1487,7 +1487,7 @@ static signed short php_ifd_get16s(void *value, int motorola_intel)
1487
1487
}
1488
1488
/* }}} */
1489
1489
1490
- /* {{{ php_ifd_get32s
1490
+ /* {{{ php_ifd_get32u
1491
1491
* Convert a 32 bit unsigned value from file's native byte order */
1492
1492
static unsigned php_ifd_get32u (void * void_value , int motorola_intel )
1493
1493
{
@@ -1506,6 +1506,33 @@ static unsigned php_ifd_get32u(void *void_value, int motorola_intel)
1506
1506
}
1507
1507
/* }}} */
1508
1508
1509
+ /* {{{ php_ifd_get64u
1510
+ * Convert a 64 bit unsigned value from file's native byte order */
1511
+ static uint64_t php_ifd_get64u (void * void_value , int motorola_intel )
1512
+ {
1513
+ uchar * value = (uchar * ) void_value ;
1514
+ if (motorola_intel ) {
1515
+ return ((uint64_t )value [0 ] << 56 )
1516
+ | ((uint64_t )value [1 ] << 48 )
1517
+ | ((uint64_t )value [2 ] << 40 )
1518
+ | ((uint64_t )value [3 ] << 32 )
1519
+ | ((uint64_t )value [4 ] << 24 )
1520
+ | ((uint64_t )value [5 ] << 16 )
1521
+ | ((uint64_t )value [6 ] << 8 )
1522
+ | ((uint64_t )value [7 ] );
1523
+ } else {
1524
+ return ((uint64_t )value [7 ] << 56 )
1525
+ | ((uint64_t )value [6 ] << 48 )
1526
+ | ((uint64_t )value [5 ] << 40 )
1527
+ | ((uint64_t )value [4 ] << 32 )
1528
+ | ((uint64_t )value [3 ] << 24 )
1529
+ | ((uint64_t )value [2 ] << 16 )
1530
+ | ((uint64_t )value [1 ] << 8 )
1531
+ | ((uint64_t )value [0 ] );
1532
+ }
1533
+ }
1534
+ /* }}} */
1535
+
1509
1536
/* {{{ php_ifd_get32u
1510
1537
* Convert a 32 bit signed value from file's native byte order */
1511
1538
static unsigned php_ifd_get32s (void * value , int motorola_intel )
@@ -1547,17 +1574,15 @@ static void php_ifd_set32u(char *data, size_t value, int motorola_intel)
1547
1574
/* }}} */
1548
1575
1549
1576
static float php_ifd_get_float (char * data ) {
1550
- /* Copy to avoid alignment issues */
1551
- float f ;
1552
- memcpy (& f , data , sizeof (float ));
1553
- return f ;
1577
+ union { uint32_t i ; float f ; } u ;
1578
+ u .i = php_ifd_get32u (data , 0 );
1579
+ return u .f ;
1554
1580
}
1555
1581
1556
1582
static double php_ifd_get_double (char * data ) {
1557
- /* Copy to avoid alignment issues */
1558
- double f ;
1559
- memcpy (& f , data , sizeof (double ));
1560
- return f ;
1583
+ union { uint64_t i ; double f ; } u ;
1584
+ u .i = php_ifd_get64u (data , 0 );
1585
+ return u .f ;
1561
1586
}
1562
1587
1563
1588
#ifdef EXIF_DEBUG
0 commit comments