From ecd12fb2ff0434da5eb22ff3a0fafb93e20fdb93 Mon Sep 17 00:00:00 2001 From: Vladimir Menshakov Date: Tue, 10 Mar 2026 22:33:04 +0000 Subject: [PATCH] VIDEO: 4XM: fix ubsan warnings --- video/4xm_decoder.cpp | 19 ++++++++----------- video/4xm_utils.h | 2 ++ 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/video/4xm_decoder.cpp b/video/4xm_decoder.cpp index 98c9a85221c..5c3cc2d0695 100644 --- a/video/4xm_decoder.cpp +++ b/video/4xm_decoder.cpp @@ -348,18 +348,16 @@ void mcdc(uint16_t *dst, const uint16_t *src, int log2w, int h = 1 << log2h; if (Scale) { for (int i = 0; i < h; ++i) { - auto *dst32 = reinterpret_cast(dst); - auto *src32 = reinterpret_cast(src); switch (log2w) { case 3: - dst32[2] = src32[2] + dc; - dst32[3] = src32[3] + dc; + WRITE_UINT32(dst + 4, READ_UINT32(src + 4) + dc); + WRITE_UINT32(dst + 6, READ_UINT32(src + 6) + dc); // fall through case 2: - dst32[1] = src32[1] + dc; + WRITE_UINT32(dst + 2, READ_UINT32(src + 2) + dc); // fall through case 1: - dst32[0] = src32[0] + dc; + WRITE_UINT32(dst, READ_UINT32(src) + dc); break; case 0: *dst = *src + dc; @@ -369,17 +367,16 @@ void mcdc(uint16_t *dst, const uint16_t *src, int log2w, } } else { for (int i = 0; i < h; ++i) { - auto *dst32 = reinterpret_cast(dst); switch (log2w) { case 3: - dst32[2] = dc; - dst32[3] = dc; + WRITE_UINT32(dst + 4, dc); + WRITE_UINT32(dst + 6, dc); // fall through case 2: - dst32[1] = dc; + WRITE_UINT32(dst + 2, dc); // fall through case 1: - dst32[0] = dc; + WRITE_UINT32(dst, dc); break; case 0: *dst = dc; diff --git a/video/4xm_utils.h b/video/4xm_utils.h index 5c6e459fe52..bd051e26460 100644 --- a/video/4xm_utils.h +++ b/video/4xm_utils.h @@ -54,6 +54,8 @@ HuffmanType loadStatistics(const byte *&huff, uint &offset) { void idct(int16_t block[64], int shift = 6); inline int readInt(int value, unsigned n) { + if (n == 0) + return 0; if ((value & (1 << (n - 1))) == 0) value += 1 - (1 << n); return value;