~vcs-imports/libiconv/trunk

« back to all changes in this revision

Viewing changes to lib/utf32be.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, 2016 Free Software Foundation, Inc.
 
2
 * Copyright (C) 1999-2001, 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
27
27
utf32be_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, size_t n)
28
28
{
29
29
  if (n >= 4) {
30
 
    ucs4_t wc = (s[0] << 24) + (s[1] << 16) + (s[2] << 8) + s[3];
 
30
    ucs4_t wc =   ((ucs4_t) s[0] << 24)
 
31
                + ((ucs4_t) s[1] << 16)
 
32
                + ((ucs4_t) s[2] << 8)
 
33
                +  (ucs4_t) s[3];
31
34
    if (wc < 0x110000 && !(wc >= 0xd800 && wc < 0xe000)) {
32
35
      *pwc = wc;
33
36
      return 4;