ht_dec.c: fix likely issue on big endian hosts (untested) 1381/head
authorEven Rouault <even.rouault@spatialys.com>
Sat, 25 Sep 2021 10:59:04 +0000 (12:59 +0200)
committerEven Rouault <even.rouault@spatialys.com>
Sat, 25 Sep 2021 10:59:04 +0000 (12:59 +0200)
src/lib/openjp2/ht_dec.c

index 680d66b650d225a72f3b5c0cddeaa00d728373f4..5160ee73a16986b7fc67faca65fcb92f0f9bf188 100644 (file)
@@ -110,6 +110,24 @@ OPJ_UINT32 count_leading_zeros(OPJ_UINT32 val)
 #endif
 }
 
+//************************************************************************/
+/** @brief Read a little-endian serialized UINT32.
+  *
+  *   @param [in]  dataIn pointer to byte stream to read from
+  */
+static INLINE OPJ_UINT32 read_le_uint32(const void* dataIn)
+{
+#if defined(OPJ_BIG_ENDIAN)
+    const OPJ_UINT8* data = (const OPJ_UINT8*)dataIn;
+    return ((OPJ_UINT32)data[0]) | (OPJ_UINT32)(data[1] << 8) | (OPJ_UINT32)(
+               data[2] << 16) | (((
+                                      OPJ_UINT32)data[3]) <<
+                                 24U);
+#else
+    return *(OPJ_UINT32*)dataIn;
+#endif
+}
+
 //************************************************************************/
 /** @brief MEL state structure for reading and decoding the MEL bitstream
   *
@@ -157,7 +175,7 @@ void mel_read(dec_mel_t *melp)
 
     val = 0xFFFFFFFF;      // feed in 0xFF if buffer is exhausted
     if (melp->size > 4) {  // if there is more than 4 bytes the MEL segment
-        val = *(OPJ_UINT32*)melp->data;  // read 32 bits from MEL data
+        val = read_le_uint32(melp->data);  // read 32 bits from MEL data
         melp->data += 4;           // advance pointer
         melp->size -= 4;           // reduce counter
     } else if (melp->size > 0) { // 4 or less
@@ -386,7 +404,7 @@ void rev_read(rev_struct_t *vlcp)
     //the next line (the if statement) needs to be tested first
     if (vlcp->size > 3) { // if there are more than 3 bytes left in VLC
         // (vlcp->data - 3) move pointer back to read 32 bits at once
-        val = *(OPJ_UINT32*)(vlcp->data - 3); // then read 32 bits
+        val = read_le_uint32(vlcp->data - 3); // then read 32 bits
         vlcp->data -= 4;                // move data pointer back by 4
         vlcp->size -= 4;                // reduce available byte by 4
     } else if (vlcp->size > 0) { // 4 or less
@@ -536,7 +554,7 @@ void rev_read_mrp(rev_struct_t *mrp)
     val = 0;
     if (mrp->size > 3) { // If there are 3 byte or more
         // (mrp->data - 3) move pointer back to read 32 bits at once
-        val = *(OPJ_UINT32*)(mrp->data - 3); // read 32 bits
+        val = read_le_uint32(mrp->data - 3); // read 32 bits
         mrp->data -= 4;                      // move back pointer
         mrp->size -= 4;                      // reduce count
     } else if (mrp->size > 0) {
@@ -887,7 +905,7 @@ void frwd_read(frwd_struct_t *msp)
 
     val = 0u;
     if (msp->size > 3) {
-        val = *(OPJ_UINT32*)msp->data;  // read 32 bits
+        val = read_le_uint32(msp->data);  // read 32 bits
         msp->data += 4;           // increment pointer
         msp->size -= 4;           // reduce size
     } else if (msp->size > 0) {