entry_name_utils-inl.h: clear top bit before shifting

Attempting to shift a uint8_t which has the top bit set results in a
value outside of the range allowable for a uint8_t. The process of
converting this value back to a uint8_t triggers ubsan's
implicit-conversion sanitizer.

Ensure the high order bit is stripped before shifting, so that the
shifted value fits into the allowable uint8_t range.

This change is necessary to enable integer sanitization on this code.

Somewhat related to Bug: 122975762
Test: atest ziparchive-tests

Change-Id: I940c8b2828ac88348d80f731274b990e35de6631
This commit is contained in:
Nick Kralevich 2019-03-21 09:29:31 -07:00
parent b4ef0beb99
commit c5da03f448

View file

@ -35,7 +35,7 @@ inline bool IsValidEntryName(const uint8_t* entry_name, const size_t length) {
return false;
} else {
// 2-5 byte sequences.
for (uint8_t first = byte << 1; first & 0x80; first <<= 1) {
for (uint8_t first = (byte & 0x7f) << 1; first & 0x80; first = (first & 0x7f) << 1) {
++i;
// Missing continuation byte..