libextractor

GNU libextractor
Log | Files | Refs | Submodules | README | LICENSE

commit b84bbef1f91ce664fca15b13b8a27f1e7bb5f888
parent 336a8f28f600a46b1419874225b707c322decbab
Author: Christian Grothoff <christian@grothoff.org>
Date:   Wed, 29 Jul 2026 12:17:01 +0200

fix type promotion issue before shifting

Diffstat:
Msrc/plugins/ole2_extractor.c | 14++++++++++----
1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/src/plugins/ole2_extractor.c b/src/plugins/ole2_extractor.c @@ -1141,10 +1141,16 @@ EXTRACTOR_ole2_extract_method (struct EXTRACTOR_ExtractContext *ec) lang, EXTRACTOR_METATYPE_LANGUAGE))) ) return; - lcb = data512[726] + (data512[727] << 8) + (data512[728] << 16) - + (data512[729] << 24); - fcb = data512[722] + (data512[723] << 8) + (data512[724] << 16) - + (data512[725] << 24); + /* The top byte must be widened before it is shifted: `unsigned char' + promotes to `int', and 0x80 << 24 overflows a 32 bit int. */ + lcb = ((uint32_t) data512[726]) + + (((uint32_t) data512[727]) << 8) + + (((uint32_t) data512[728]) << 16) + + (((uint32_t) data512[729]) << 24); + fcb = ((uint32_t) data512[722]) + + (((uint32_t) data512[723]) << 8) + + (((uint32_t) data512[724]) << 16) + + (((uint32_t) data512[725]) << 24); if (0 != ec->seek (ec->cls, 0, SEEK_SET))