~vcs-imports/libiconv/trunk

« back to all changes in this revision

Viewing changes to lib/utf32.h

  • Committer: Bruno Haible
  • Date: 2024-10-05 00:26:56 UTC
  • Revision ID: git-v1:eed6782cbb4651876e3c8b27ea53273f230ee8e2
Fix undefined behaviour caused by shifting (unsigned char) << 24.

Reported by Tim Sweet <tsweet64@protonmail.com>
at <https://savannah.gnu.org/bugs/?66289>.

* lib/ucs4.h (ucs4_mbtowc): Cast 'unsigned char' values to ucs4_t before
shifting them to the left.
* lib/ucs4be.h (ucs4be_mbtowc): Likewise.
* lib/ucs4le.h (ucs4le_mbtowc): Likewise.
* lib/utf32.h (utf32_mbtowc): Likewise.
* lib/utf32be.h (utf32be_mbtowc): Likewise.
* lib/utf32le.h (utf32le_mbtowc): Likewise.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/*
2
 
 * Copyright (C) 1999-2001, 2008, 2011, 2016 Free Software Foundation, Inc.
 
2
 * Copyright (C) 1999-2001, 2008, 2011, 2016, 2024 Free Software Foundation, Inc.
3
3
 * This file is part of the GNU LIBICONV Library.
4
4
 *
5
5
 * The GNU LIBICONV Library is free software; you can redistribute it
37
37
  int count = 0;
38
38
  for (; n >= 4 && count <= RET_COUNT_MAX && count <= INT_MAX-4;) {
39
39
    ucs4_t wc = (state
40
 
                  ? s[0] + (s[1] << 8) + (s[2] << 16) + (s[3] << 24)
41
 
                  : (s[0] << 24) + (s[1] << 16) + (s[2] << 8) + s[3]);
 
40
                  ?    (ucs4_t) s[0]
 
41
                    + ((ucs4_t) s[1] << 8)
 
42
                    + ((ucs4_t) s[2] << 16)
 
43
                    + ((ucs4_t) s[3] << 24)
 
44
                  :   ((ucs4_t) s[0] << 24)
 
45
                    + ((ucs4_t) s[1] << 16)
 
46
                    + ((ucs4_t) s[2] << 8)
 
47
                    +  (ucs4_t) s[3]);
42
48
    if (wc == 0x0000feff) {
43
49
    } else if (wc == 0xfffe0000u) {
44
50
      state ^= 1;