UBSan fix: avoid undefined behaviour in bitmask
Andrew Haley <[email protected]> Fri, 28 Mar 2014 17:38:56 +0000
| Newsgroups | gmane.comp.gcc.patches,gmane.comp.gcc.java.patches |
|---|---|
| Message-ID | <[email protected]> |
UBSan detected that we were trying to set a non-existent bit in a mask. I don't think it has mattered before now because when this happens the value in the mask is not used. However, better safe than sorry. Andrew. 2014-03-28 Andrew Haley <[email protected]> * boehm.c (mark_reference_fields): Avoid unsigned integer overflow when calculating an index into a bitmap descriptor. Index: gcc/java/boehm.c =================================================================== --- gcc/java/boehm.c (revision 208839) +++ gcc/java/boehm.c (working copy) @@ -107,7 +107,11 @@ bits for all words in the record. This is conservative, but the size_words != 1 case is impossible in regular java code. */ for (i = 0; i < size_words; ++i) - *mask = (*mask).set_bit (ubit - count - i - 1); + { + int bitpos = ubit - count - i - 1; + if (bitpos >= 0) + *mask = (*mask).set_bit (bitpos); + } if (count >= ubit - 2) *pointer_after_end = 1;