Index: src/OFString.m ================================================================== --- src/OFString.m +++ src/OFString.m @@ -994,10 +994,11 @@ - (uintmax_t)hexadecimalValue { int i = 0; uintmax_t num = 0; + BOOL suffix = NO; if (length == 0) return 0; if (length >= 2 && string[0] == '0' && string[1] == 'x') @@ -1009,17 +1010,23 @@ @throw [OFInvalidEncodingException newWithClass: isa]; for (; i < length; i++) { uintmax_t newnum; + if (suffix) + @throw [OFInvalidEncodingException newWithClass: isa]; + if (string[i] >= '0' && string[i] <= '9') newnum = (num << 4) | (string[i] - '0'); else if (string[i] >= 'A' && string[i] <= 'F') newnum = (num << 4) | (string[i] - 'A' + 10); else if (string[i] >= 'a' && string[i] <= 'f') newnum = (num << 4) | (string[i] - 'a' + 10); - else + else if (string[i] == 'h') { + suffix = YES; + continue; + } else @throw [OFInvalidEncodingException newWithClass: isa]; if (newnum < num) @throw [OFOutOfRangeException newWithClass: isa]; Index: tests/OFStringTests.m ================================================================== --- tests/OFStringTests.m +++ tests/OFStringTests.m @@ -229,10 +229,11 @@ TEST(@"-[hexadecimalValue]", [@"123f" hexadecimalValue] == 0x123f && [@"0xABcd" hexadecimalValue] == 0xABCD && [@"xbCDE" hexadecimalValue] == 0xBCDE && [@"$CdEf" hexadecimalValue] == 0xCDEF && + [@"Feh" hexadecimalValue] == 0xFE && [@"" hexadecimalValue] == 0) EXPECT_EXCEPTION(@"Detect invalid characters in -[decimalValue] #1", OFInvalidEncodingException, [@"abc" decimalValue]) EXPECT_EXCEPTION(@"Detect invalid characters in -[decimalValue] #2",