]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
ubsan: integer overflow in s_fill
authorAlan Modra <amodra@gmail.com>
Sun, 18 May 2025 10:10:34 +0000 (19:40 +0930)
committerAlan Modra <amodra@gmail.com>
Mon, 19 May 2025 13:09:51 +0000 (22:39 +0930)
Silence ubsan warning.  We don't worry about wrap-around in most
places that adjust abs_section_offset, so don't fuss over an overflow
in the multiplication here.

* read.c (s_fill): Replace "long" vars with offsetT and valueT.
Avoid signed overflow calculating abs_section_offset.

gas/read.c

index 2691f31c4ade56a5dc44bf98a134237ce7294756..eaa1300ff966b0403f89863abb91c0a0d9f8af07 100644 (file)
@@ -2263,8 +2263,8 @@ void
 s_fill (int ignore ATTRIBUTE_UNUSED)
 {
   expressionS rep_exp;
-  long size = 1;
-  long fill = 0;
+  offsetT size = 1;
+  valueT fill = 0;
   char *p;
 
 #ifdef md_flush_pending_output
@@ -2330,7 +2330,7 @@ s_fill (int ignore ATTRIBUTE_UNUSED)
   if (size && !need_pass_2)
     {
       if (now_seg == absolute_section)
-       abs_section_offset += rep_exp.X_add_number * size;
+       abs_section_offset += (valueT) rep_exp.X_add_number * size;
 
       if (rep_exp.X_op == O_constant)
        {
@@ -2373,7 +2373,7 @@ s_fill (int ignore ATTRIBUTE_UNUSED)
         bytes from a 4-byte expression and they forgot to sign
         extend.  */
 #define BSD_FILL_SIZE_CROCK_4 (4)
-      md_number_to_chars (p, (valueT) fill,
+      md_number_to_chars (p, fill,
                          (size > BSD_FILL_SIZE_CROCK_4
                           ? BSD_FILL_SIZE_CROCK_4
                           : (int) size));