]> 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>
Mon, 10 Mar 2025 16:28:33 +0000 (17:28 +0100)
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 fbda8372e725ca160fa7ff53d04c896ce77d5b71..52a6f1619229be8e7d8055bc027d242a439db2cf 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-10  Bruno Haible  <bruno@clisp.org>
 
        getlogin, getlogin_r: Document limitation.
index a31ea3d1003dee779a9a0b603e7d965fcb8784c9..a587cd5b454ae569f07a1b3f48e74e95fce20021 100644 (file)
@@ -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;
 }