Index: src/OFString.m ================================================================== --- src/OFString.m +++ src/OFString.m @@ -802,15 +802,20 @@ intmax_t num = 0; if (string[0] == '-') i++; - /* FIXME: Add overflow check */ for (; i < length; i++) { - if (string[i] >= '0' && string[i] <= '9') - num = (num * 10) + (string[i] - '0'); - else + if (string[i] >= '0' && string[i] <= '9') { + intmax_t newnum = (num * 10) + (string[i] - '0'); + + if (newnum < num) + @throw [OFOutOfRangeException + newWithClass: isa]; + + num = newnum; + } else @throw [OFInvalidEncodingException newWithClass: isa]; } if (string[0] == '-') num *= -1; @@ -819,11 +824,11 @@ } - (intmax_t)hexadecimalValueAsInteger { int i = 0; - intmax_t num = 0; + uintmax_t num = 0; if (length == 0) return 0; if (length >= 2 && string[0] == '0' && string[1] == 'x') @@ -832,20 +837,26 @@ i = 1; if (i == length) @throw [OFInvalidEncodingException newWithClass: isa]; - /* FIXME: Add overflow check */ for (; i < length; i++) { + uintmax_t newnum; + if (string[i] >= '0' && string[i] <= '9') - num = (num << 4) | (string[i] - '0'); + newnum = (num << 4) | (string[i] - '0'); else if (string[i] >= 'A' && string[i] <= 'F') - num = (num << 4) | (string[i] - 'A' + 10); + newnum = (num << 4) | (string[i] - 'A' + 10); else if (string[i] >= 'a' && string[i] <= 'f') - num = (num << 4) | (string[i] - 'a' + 10); + newnum = (num << 4) | (string[i] - 'a' + 10); else @throw [OFInvalidEncodingException newWithClass: isa]; + + if (newnum < num) + @throw [OFOutOfRangeException newWithClass: isa]; + + num = newnum; } return num; } Index: tests/OFString.m ================================================================== --- tests/OFString.m +++ tests/OFString.m @@ -195,10 +195,11 @@ [[a objectAtIndex: i++] isEqual: @""] && [[a objectAtIndex: i++] isEqual: @""]) TEST(@"-[decimalValueAsInteger]", [@"1234" decimalValueAsInteger] == 1234 && + [@"-500" decimalValueAsInteger] == -500 && [@"" decimalValueAsInteger] == 0) TEST(@"-[hexadecimalValueAsInteger]", [@"123f" hexadecimalValueAsInteger] == 0x123f && [@"0xABcd" hexadecimalValueAsInteger] == 0xABCD && @@ -220,10 +221,22 @@ @"-[hexadecimalValueAsInteger] #2", OFInvalidEncodingException, [@"0x" hexadecimalValueAsInteger]) EXPECT_EXCEPTION(@"Detect invalid chars in " @"-[hexadecimalValueAsInteger] #3", OFInvalidEncodingException, [@"$" hexadecimalValueAsInteger]) + + EXPECT_EXCEPTION(@"Detect out of range in -[decimalValueAsInteger", + OFOutOfRangeException, + [@"12345678901234567890123456789012345678901234567890" + @"12345678901234567890123456789012345678901234567890" + decimalValueAsInteger]) + + EXPECT_EXCEPTION(@"Detect out of range in -[hexadecilamValueAsInteger", + OFOutOfRangeException, + [@"0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF" + @"0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF" + hexadecimalValueAsInteger]) TEST(@"-[md5Hash]", [[@"asdfoobar" md5Hash] isEqual: @"184dce2ec49b5422c7cfd8728864db4c"]) TEST(@"-[sha1Hash]", [[@"asdfoobar" sha1Hash]