Skip to content

Commit 085cac6

Browse files
committed
Merge #14734: fix an undefined behavior in uint::SetHex
0f459d8 fix an undefined behavior in uint::SetHex (Kaz Wesley) Pull request description: Decrementing psz beyond the beginning of the string is UB, even though the out-of-bounds pointer is never dereferenced. I don't think any clang sanitizer covers this, so I don't see any way a test could catch the original behavior. ACKs for top commit: promag: utACK 0f459d8. l2a5b1: utACK 0f459d8 Tree-SHA512: 388223254ea6e955f643d2ebdf74d15a3d494e9f0597d9f05987ebb708d7a1cc06ce64bd25d447d75b5f5561bdae9630dcf25adb7bd75f7a382298b95d127162
2 parents 38fbb57 + 0f459d8 commit 085cac6

File tree

1 file changed

+7
-8
lines changed

1 file changed

+7
-8
lines changed

src/uint256.cpp

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,16 +37,15 @@ void base_blob<BITS>::SetHex(const char* psz)
3737
psz += 2;
3838

3939
// hex string to uint
40-
const char* pbegin = psz;
41-
while (::HexDigit(*psz) != -1)
42-
psz++;
43-
psz--;
40+
size_t digits = 0;
41+
while (::HexDigit(psz[digits]) != -1)
42+
digits++;
4443
unsigned char* p1 = (unsigned char*)data;
4544
unsigned char* pend = p1 + WIDTH;
46-
while (psz >= pbegin && p1 < pend) {
47-
*p1 = ::HexDigit(*psz--);
48-
if (psz >= pbegin) {
49-
*p1 |= ((unsigned char)::HexDigit(*psz--) << 4);
45+
while (digits > 0 && p1 < pend) {
46+
*p1 = ::HexDigit(psz[--digits]);
47+
if (digits > 0) {
48+
*p1 |= ((unsigned char)::HexDigit(psz[--digits]) << 4);
5049
p1++;
5150
}
5251
}

0 commit comments

Comments
 (0)