Skip to content

Commit 0f459d8

Browse files
committed
fix an undefined behavior in uint::SetHex
Decrementing psz beyond the beginning of the string is UB, even though the out-of-bounds pointer is never dereferenced.
1 parent e74649e commit 0f459d8

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)