From 792a0e6decedf916c5606cc77b95cc12002c8877 Mon Sep 17 00:00:00 2001 From: Calvin Buckley Date: Sun, 22 Sep 2024 15:26:59 -0300 Subject: [PATCH] Cast big endian byte shuffling to uint This works, but UBSan running on a big endian platform (in this, ppc64) will complain that the ((uchar*)buffer)[n] is int, and shifting that could be weird. Since the value of PHAR_GET_32 et al are almost always unsigned, it makes sense to cast these as unsigned. Fixes phar tests on a big endian system with UBSan enabled. --- ext/phar/phar.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ext/phar/phar.c b/ext/phar/phar.c index b774f22e2d565..e3d6ea74c6182 100644 --- a/ext/phar/phar.c +++ b/ext/phar/phar.c @@ -457,14 +457,14 @@ void phar_entry_remove(phar_entry_data *idata, char **error) /* {{{ */ #ifdef WORDS_BIGENDIAN # define PHAR_GET_32(buffer, var) \ - var = ((((unsigned char*)(buffer))[3]) << 24) \ - | ((((unsigned char*)(buffer))[2]) << 16) \ - | ((((unsigned char*)(buffer))[1]) << 8) \ - | (((unsigned char*)(buffer))[0]); \ + var = ((uint32_t)(((unsigned char*)(buffer))[3]) << 24) \ + | ((uint32_t)(((unsigned char*)(buffer))[2]) << 16) \ + | ((uint32_t)(((unsigned char*)(buffer))[1]) << 8) \ + | ((uint32_t)((unsigned char*)(buffer))[0]); \ (buffer) += 4 # define PHAR_GET_16(buffer, var) \ - var = ((((unsigned char*)(buffer))[1]) << 8) \ - | (((unsigned char*)(buffer))[0]); \ + var = ((uint16_t)(((unsigned char*)(buffer))[1]) << 8) \ + | ((uint16_t)((unsigned char*)(buffer))[0]); \ (buffer) += 2 #else # define PHAR_GET_32(buffer, var) \