jpeg_loader: resolve the asan bug report. 73/289173/1
authorHermet Park <hermetpark@gmail.com>
Wed, 16 Feb 2022 03:22:53 +0000 (12:22 +0900)
committerMichal Szczecinski <m.szczecinsk@partner.samsung.com>
Thu, 2 Mar 2023 08:11:07 +0000 (09:11 +0100)
fix the invalid negative shift operations.

@Issue: https://github.com/Samsung/thorvg/issues/1172

Change-Id: I36aac7ecc1869464a5be9cbabf69cd3120d894a2

src/loaders/jpg/tvgJpgd.cpp

index b80516a..dacd45e 100644 (file)
@@ -382,8 +382,8 @@ struct Row
         const int tmp2 = z1 + MULTIPLY(z3, - FIX_1_847759065);
         const int tmp3 = z1 + MULTIPLY(z2, FIX_0_765366865);
 
-        const int tmp0 = (ACCESS_COL(0) + ACCESS_COL(4)) << CONST_BITS;
-        const int tmp1 = (ACCESS_COL(0) - ACCESS_COL(4)) << CONST_BITS;
+        const int tmp0 = static_cast<unsigned int>(ACCESS_COL(0) + ACCESS_COL(4)) << CONST_BITS;
+        const int tmp1 = static_cast<unsigned int>(ACCESS_COL(0) - ACCESS_COL(4)) << CONST_BITS;
 
         const int tmp10 = tmp0 + tmp3, tmp13 = tmp0 - tmp3, tmp11 = tmp1 + tmp2, tmp12 = tmp1 - tmp2;
 
@@ -461,8 +461,8 @@ struct Col
         const int tmp2 = z1 + MULTIPLY(z3, - FIX_1_847759065);
         const int tmp3 = z1 + MULTIPLY(z2, FIX_0_765366865);
 
-        const int tmp0 = (ACCESS_ROW(0) + ACCESS_ROW(4)) << CONST_BITS;
-        const int tmp1 = (ACCESS_ROW(0) - ACCESS_ROW(4)) << CONST_BITS;
+        const int tmp0 = static_cast<unsigned int>(ACCESS_ROW(0) + ACCESS_ROW(4)) << CONST_BITS;
+        const int tmp1 = static_cast<unsigned int>(ACCESS_ROW(0) - ACCESS_ROW(4)) << CONST_BITS;
 
         const int tmp10 = tmp0 + tmp3, tmp13 = tmp0 - tmp3, tmp11 = tmp1 + tmp2, tmp12 = tmp1 - tmp2;
 
@@ -2557,7 +2557,7 @@ void jpeg_decoder::decode_block_dc_first(jpeg_decoder *pD, int component_id, int
         s = JPGD_HUFF_EXTEND(r, s);
     }
     pD->m_last_dc_val[component_id] = (s += pD->m_last_dc_val[component_id]);
-    p[0] = static_cast<jpgd_block_t>(s << pD->m_successive_low);
+    p[0] = static_cast<jpgd_block_t>(static_cast<unsigned int>(s) << pD->m_successive_low);
 }
 
 
@@ -2588,7 +2588,7 @@ void jpeg_decoder::decode_block_ac_first(jpeg_decoder *pD, int component_id, int
             if ((k += r) > 63) pD->stop_decoding(JPGD_DECODE_ERROR);
             r = pD->get_bits_no_markers(s);
             s = JPGD_HUFF_EXTEND(r, s);
-            p[g_ZAG[k]] = static_cast<jpgd_block_t>(s << pD->m_successive_low);
+            p[g_ZAG[k]] = static_cast<jpgd_block_t>(static_cast<unsigned int>(s) << pD->m_successive_low);
         } else {
             if (r == 15) {
                 if ((k += 15) > 63) pD->stop_decoding(JPGD_DECODE_ERROR);
@@ -2607,7 +2607,7 @@ void jpeg_decoder::decode_block_ac_refine(jpeg_decoder *pD, int component_id, in
 {
     int s, k, r;
     int p1 = 1 << pD->m_successive_low;
-    int m1 = (-1) << pD->m_successive_low;
+    int m1 = static_cast<unsigned int>(-1) << pD->m_successive_low;
     jpgd_block_t *p = pD->coeff_buf_getp(pD->m_ac_coeffs[component_id], block_x, block_y);
     
     JPGD_ASSERT(pD->m_spectral_end <= 63);