diff options
author | Alan Modra <amodra@gmail.com> | 2022-08-06 10:34:04 +0930 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2022-08-06 18:43:04 +0930 |
commit | 77b38f6db98e046232ecaac11b61c453965fb75a (patch) | |
tree | 44a085e1f97012dc55c6a02294f4e256d24473f8 /bfd/som.c | |
parent | 9663a947c09f63f75491dd4ad2f38fb448142240 (diff) | |
download | gdb-77b38f6db98e046232ecaac11b61c453965fb75a.zip gdb-77b38f6db98e046232ecaac11b61c453965fb75a.tar.gz gdb-77b38f6db98e046232ecaac11b61c453965fb75a.tar.bz2 |
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.
Diffstat (limited to 'bfd/som.c')
-rw-r--r-- | bfd/som.c | 20 |
1 files changed, 12 insertions, 8 deletions
@@ -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. */ |