IBM zSystems: Fix left-shifting negative PCRel32 values (PR gas/29152)
authorIlya Leoshkevich <iii@linux.ibm.com>
Mon, 16 May 2022 19:58:55 +0000 (21:58 +0200)
committerAndreas Krebbel <krebbel@linux.ibm.com>
Mon, 16 May 2022 20:00:17 +0000 (22:00 +0200)
s390_insert_operand ()'s val, min and max are encoded PCRel32 values
and need to be left-shifted by 1 before being shown to the user.
Left-shifting negative values is undefined behavior in C, but the
current code does not try to prevent it, causing UBSan to complain.

Fix by casting the values to their unsigned equivalents before
shifting.

gas/config/tc-s390.c

index fb452f8a986087bca861bc2a044c4a09c68f7510..04a3c059c91016747b1c7911b6c311d3b748b628 100644 (file)
@@ -622,9 +622,9 @@ s390_insert_operand (unsigned char *insn,
 
          if (operand->flags & S390_OPERAND_PCREL)
            {
-             val <<= 1;
-             min <<= 1;
-             max <<= 1;
+             val = (offsetT) ((addressT) val << 1);
+             min = (offsetT) ((addressT) min << 1);
+             max = (offsetT) ((addressT) max << 1);
            }
          if (file == (char *) NULL)
            as_bad (err, (int64_t) val, (int64_t) min, (int64_t) max);