Skip to content

Commit e1782c0

Browse files
committed
Fix ASAN undefined behavior (unsigned char << 24)
ext/mbstring/libmbfl/filters/mbfilter_utf32.c:259:20: runtime error: left shift of 128 by 24 places cannot be represented in type 'int'
1 parent 3c4c200 commit e1782c0

File tree

2 files changed

+24
-24
lines changed

2 files changed

+24
-24
lines changed

ext/mbstring/libmbfl/filters/mbfilter_ucs4.c

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -320,10 +320,10 @@ static size_t mb_ucs4_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf
320320
return mb_ucs4le_to_wchar(in, in_len, buf, bufsize, NULL);
321321
} else if (*in_len >= 4) {
322322
unsigned char *p = *in;
323-
unsigned char c1 = *p++;
324-
unsigned char c2 = *p++;
325-
unsigned char c3 = *p++;
326-
unsigned char c4 = *p++;
323+
uint32_t c1 = *p++;
324+
uint32_t c2 = *p++;
325+
uint32_t c3 = *p++;
326+
uint32_t c4 = *p++;
327327
uint32_t w = (c1 << 24) | (c2 << 16) | (c3 << 8) | c4;
328328

329329
if (w == 0xFFFE0000) {
@@ -349,10 +349,10 @@ static size_t mb_ucs4be_to_wchar(unsigned char **in, size_t *in_len, uint32_t *b
349349
uint32_t *out = buf, *limit = buf + bufsize;
350350

351351
while (p < e && out < limit) {
352-
unsigned char c1 = *p++;
353-
unsigned char c2 = *p++;
354-
unsigned char c3 = *p++;
355-
unsigned char c4 = *p++;
352+
uint32_t c1 = *p++;
353+
uint32_t c2 = *p++;
354+
uint32_t c3 = *p++;
355+
uint32_t c4 = *p++;
356356
uint32_t w = (c1 << 24) | (c2 << 16) | (c3 << 8) | c4;
357357
*out++ = w;
358358
}
@@ -393,10 +393,10 @@ static size_t mb_ucs4le_to_wchar(unsigned char **in, size_t *in_len, uint32_t *b
393393
uint32_t *out = buf, *limit = buf + bufsize;
394394

395395
while (p < e && out < limit) {
396-
unsigned char c1 = *p++;
397-
unsigned char c2 = *p++;
398-
unsigned char c3 = *p++;
399-
unsigned char c4 = *p++;
396+
uint32_t c1 = *p++;
397+
uint32_t c2 = *p++;
398+
uint32_t c3 = *p++;
399+
uint32_t c4 = *p++;
400400
uint32_t w = (c4 << 24) | (c3 << 16) | (c2 << 8) | c1;
401401
*out++ = w;
402402
}

ext/mbstring/libmbfl/filters/mbfilter_utf32.c

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -252,10 +252,10 @@ static size_t mb_utf32_to_wchar(unsigned char **in, size_t *in_len, uint32_t *bu
252252
return mb_utf32le_to_wchar(in, in_len, buf, bufsize, NULL);
253253
} else if (*in_len >= 4) {
254254
unsigned char *p = *in;
255-
unsigned char c1 = *p++;
256-
unsigned char c2 = *p++;
257-
unsigned char c3 = *p++;
258-
unsigned char c4 = *p++;
255+
uint32_t c1 = *p++;
256+
uint32_t c2 = *p++;
257+
uint32_t c3 = *p++;
258+
uint32_t c4 = *p++;
259259
uint32_t w = (c1 << 24) | (c2 << 16) | (c3 << 8) | c4;
260260

261261
if (w == 0xFFFE0000) {
@@ -281,10 +281,10 @@ static size_t mb_utf32be_to_wchar(unsigned char **in, size_t *in_len, uint32_t *
281281
uint32_t *out = buf, *limit = buf + bufsize;
282282

283283
while (p < e && out < limit) {
284-
unsigned char c1 = *p++;
285-
unsigned char c2 = *p++;
286-
unsigned char c3 = *p++;
287-
unsigned char c4 = *p++;
284+
uint32_t c1 = *p++;
285+
uint32_t c2 = *p++;
286+
uint32_t c3 = *p++;
287+
uint32_t c4 = *p++;
288288
uint32_t w = (c1 << 24) | (c2 << 16) | (c3 << 8) | c4;
289289

290290
if (w < MBFL_WCSPLANE_UTF32MAX && (w < 0xD800 || w > 0xDFFF)) {
@@ -330,10 +330,10 @@ static size_t mb_utf32le_to_wchar(unsigned char **in, size_t *in_len, uint32_t *
330330
uint32_t *out = buf, *limit = buf + bufsize;
331331

332332
while (p < e && out < limit) {
333-
unsigned char c1 = *p++;
334-
unsigned char c2 = *p++;
335-
unsigned char c3 = *p++;
336-
unsigned char c4 = *p++;
333+
uint32_t c1 = *p++;
334+
uint32_t c2 = *p++;
335+
uint32_t c3 = *p++;
336+
uint32_t c4 = *p++;
337337
uint32_t w = (c4 << 24) | (c3 << 16) | (c2 << 8) | c1;
338338

339339
if (w < MBFL_WCSPLANE_UTF32MAX && (w < 0xD800 || w > 0xDFFF)) {

0 commit comments

Comments
 (0)