]> Savannah Git Hosting - gnulib.git/commitdiff
quotearg: Avoid undefined behaviour.
authorBruno Haible <bruno@clisp.org>
Mon, 10 Mar 2025 16:28:33 +0000 (17:28 +0100)
committerBruno Haible <bruno@clisp.org>
Tue, 1 Apr 2025 14:49:26 +0000 (16:49 +0200)
Reported by Kirill Furman <kfurman@astralinux.ru> in
<https://lists.gnu.org/archive/html/bug-gnulib/2025-03/msg00037.html>.

* lib/quotearg.c (set_char_quoting): Use 'unsigned int', not 'int', for
doing bit mask operations.

ChangeLog
lib/quotearg.c

index 5d572fb7ba3963483693662715baa4c1bec3c558..f18bf403b9da8520f1bd0623f44a374405623a35 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2025-03-10  Bruno Haible  <bruno@clisp.org>
+
+       quotearg: Avoid undefined behaviour.
+       Reported by Kirill Furman <kfurman@astralinux.ru> in
+       <https://lists.gnu.org/archive/html/bug-gnulib/2025-03/msg00037.html>.
+       * lib/quotearg.c (set_char_quoting): Use 'unsigned int', not 'int', for
+       doing bit mask operations.
+
 2025-03-03  Bruno Haible  <bruno@clisp.org>
 
        vasprintf-posix, vasprintf-gnu: Fix module description.
index 8e359beead7b6ce96bb2ef084bd55b0696b6f6f8..4562b83422f4ff51ca506c320907710e4b386050 100644 (file)
@@ -1,6 +1,6 @@
 /* quotearg.c - quote arguments for output
 
-   Copyright (C) 1998-2002, 2004-2024 Free Software Foundation, Inc.
+   Copyright (C) 1998-2002, 2004-2025 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -147,8 +147,8 @@ set_char_quoting (struct quoting_options *o, char c, int i)
   unsigned int *p =
     (o ? o : &default_quoting_options)->quote_these_too + uc / INT_BITS;
   int shift = uc % INT_BITS;
-  int r = (*p >> shift) & 1;
-  *p ^= ((i & 1) ^ r) << shift;
+  unsigned int r = (*p >> shift) & 1;
+  *p ^= ((i & 1U) ^ r) << shift;
   return r;
 }