From 5573638fcc95997f72b5cdfb060a2019faed555d Mon Sep 17 00:00:00 2001 From: Aleksander Czajczynski Date: Sat, 22 Nov 2025 12:40:36 +0100 Subject: [PATCH] 2025-11-22 12:40 UTC+0100 Aleksander Czajczynski (hb fki.pl) * include/hbdefs.h ! fix undefined behaviour on signed int overflow in HB_GET_LE_INT24(), HB_GET_BE_INT24() macros reported by runtime sanitizer (LLVM -fsanitize-trap=undefined) panic: left shift of 255 by 24 places cannot be represented in type 'HB_I32' (aka 'int') --- ChangeLog.txt | 8 ++++++++ include/hbdefs.h | 16 ++++++++-------- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/ChangeLog.txt b/ChangeLog.txt index 6c87ac1e9f..ee39ca2028 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -7,6 +7,14 @@ Entries may not always be in chronological/commit order. See license at the end of file. */ +2025-11-22 12:40 UTC+0100 Aleksander Czajczynski (hb fki.pl) + * include/hbdefs.h + ! fix undefined behaviour on signed int overflow in + HB_GET_LE_INT24(), HB_GET_BE_INT24() macros + reported by runtime sanitizer (LLVM -fsanitize-trap=undefined) + panic: left shift of 255 by 24 places cannot be represented + in type 'HB_I32' (aka 'int') + 2025-11-17 14:14 UTC+0200 Aleksander Czajczynski (hb fki.pl) ; sync macros in-line with Viktor's fork: 2015-06-16 01:41 UTC+0200 Viktor Szakats (vszakats users.noreply.github.com) diff --git a/include/hbdefs.h b/include/hbdefs.h index 97dd67544e..733c3f9a26 100644 --- a/include/hbdefs.h +++ b/include/hbdefs.h @@ -1429,10 +1429,10 @@ typedef HB_U32 HB_FATTR; * so we always have to build them from HB_BYTEs and cannot use C casting */ #define HB_GET_LE_INT24( p ) ( ( HB_I32 ) \ - ( ( ( HB_I32 ) (( const HB_BYTE * )( p ))[ 0 ] ) | \ - ( ( HB_I32 ) (( const HB_BYTE * )( p ))[ 1 ] << 8 ) | \ - ( ( HB_I32 ) (( const HB_BYTE * )( p ))[ 2 ] << 16 ) | \ - ( ( HB_I32 ) (((( const HB_BYTE * )( p ))[ 2 ] & 0x80 ) ? 0xFF : 0x00 ) << 24 ) ) ) + ( ( ( HB_U32 ) (( const HB_BYTE * )( p ))[ 0 ] ) | \ + ( ( HB_U32 ) (( const HB_BYTE * )( p ))[ 1 ] << 8 ) | \ + ( ( HB_U32 ) (( const HB_BYTE * )( p ))[ 2 ] << 16 ) | \ + ( ( HB_U32 ) (((( const HB_BYTE * )( p ))[ 2 ] & 0x80 ) ? 0xFFu : 0x00u ) << 24 ) ) ) #define HB_GET_LE_UINT24( p ) ( ( HB_U32 ) \ ( ( ( HB_U32 ) (( const HB_BYTE * )( p ))[ 0 ] ) | \ ( ( HB_U32 ) (( const HB_BYTE * )( p ))[ 1 ] << 8 ) | \ @@ -1443,10 +1443,10 @@ typedef HB_U32 HB_FATTR; (( HB_BYTE * )( p ))[ 2 ] = ( HB_BYTE )( ( u ) >> 16 ); \ } while( 0 ) #define HB_GET_BE_INT24( p ) ( ( HB_I32 ) \ - ( ( ( HB_I32 ) (( const HB_BYTE * )( p ))[ 2 ] ) | \ - ( ( HB_I32 ) (( const HB_BYTE * )( p ))[ 1 ] << 8 ) | \ - ( ( HB_I32 ) (( const HB_BYTE * )( p ))[ 0 ] << 16 ) | \ - ( ( HB_I32 ) (((( const HB_BYTE * )( p ))[ 0 ] & 0x80 ) ? 0xFF : 0x00 ) << 24 ) ) ) + ( ( ( HB_U32 ) (( const HB_BYTE * )( p ))[ 2 ] ) | \ + ( ( HB_U32 ) (( const HB_BYTE * )( p ))[ 1 ] << 8 ) | \ + ( ( HB_U32 ) (( const HB_BYTE * )( p ))[ 0 ] << 16 ) | \ + ( ( HB_U32 ) (((( const HB_BYTE * )( p ))[ 0 ] & 0x80 ) ? 0xFFu : 0x00u ) << 24 ) ) ) #define HB_GET_BE_UINT24( p ) ( ( HB_U32 ) \ ( ( ( HB_U32 ) (( const HB_BYTE * )( p ))[ 2 ] ) | \ ( ( HB_U32 ) (( const HB_BYTE * )( p ))[ 1 ] << 8 ) | \