From: Alan Modra Date: Sat, 6 Aug 2022 01:04:04 +0000 (+0930) Subject: ubsan: som.c undefined shift in som_set_reloc_info X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=77b38f6db98e046232ecaac11b61c453965fb75a;p=binutils-gdb.git ubsan: som.c undefined shift in som_set_reloc_info Do the shift using unsigned variables to avoid UB on << 8. * som.c (som_set_reloc_info): Make v unsigned. Localise some variables to their blocks. --- diff --git a/bfd/som.c b/bfd/som.c index 90928b7641d..d33ad67561a 100644 --- a/bfd/som.c +++ b/bfd/som.c @@ -4941,13 +4941,9 @@ som_set_reloc_info (unsigned char *fixup, unsigned int symcount, bool just_count) { - unsigned int op, varname, deallocate_contents = 0; + unsigned int deallocate_contents = 0; unsigned char *end_fixups = &fixup[end]; - const struct fixup_format *fp; - const char *cp; - unsigned char *save_fixup; - int variables[26], stack[20], c, v, count, prev_fixup, *sp, saved_unwind_bits; - const int *subop; + int variables[26], stack[20], count, prev_fixup, *sp, saved_unwind_bits; arelent *rptr = internal_relocs; unsigned int offset = 0; @@ -4966,10 +4962,14 @@ som_set_reloc_info (unsigned char *fixup, while (fixup < end_fixups) { + const char *cp; + unsigned int op; + const struct fixup_format *fp; + /* Save pointer to the start of this fixup. We'll use it later to determine if it is necessary to put this fixup on the queue. */ - save_fixup = fixup; + unsigned char *save_fixup = fixup; /* Get the fixup code and its associated format. */ op = *fixup++; @@ -5015,11 +5015,15 @@ som_set_reloc_info (unsigned char *fixup, while (*cp) { /* The variable this pass is going to compute a value for. */ - varname = *cp++; + unsigned int varname = *cp++; + const int *subop; + int c; /* Start processing RHS. Continue until a NULL or '=' is found. */ do { + unsigned v; + c = *cp++; /* If this is a variable, push it on the stack. */