From 0832f233683d61d1545f1e4c4ae2543509ad763b Mon Sep 17 00:00:00 2001 From: Jonathan Schleifer Date: Tue, 11 Mar 2025 01:10:08 +0000 Subject: [PATCH] OFString: Fix parsing LLONG_MIN FossilOrigin-Name: 6f7cdf414a32b65fb7bb40f834156898e77bb6901af75dd02afbf4cbb3aa2233 --- src/OFString.m | 20 ++++++++++++++------ tests/OFStringTests.m | 4 ++++ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/OFString.m b/src/OFString.m index d5363a0da..53b8fb2fd 100644 --- a/src/OFString.m +++ b/src/OFString.m @@ -2385,7 +2385,7 @@ OF_SINGLETON_METHODS void *pool = objc_autoreleasePoolPush(); const char *UTF8String = self.UTF8String; bool negative = false; - long long value = 0; + unsigned long long value = 0; while (OFASCIIIsSpace(*UTF8String)) UTF8String++; @@ -2437,18 +2437,26 @@ OF_SINGLETON_METHODS if (c >= base) @throw [OFInvalidFormatException exception]; - if (LLONG_MAX / base < value || LLONG_MAX - (value * base) < c) + if (ULLONG_MAX / base < value || + ULLONG_MAX - (value * base) < c) @throw [OFOutOfRangeException exception]; value = (value * base) + c; } - if (negative) - value *= -1; - objc_autoreleasePoolPop(pool); - return value; + if (negative) { + if (value > -(unsigned long long)LLONG_MIN) + @throw [OFOutOfRangeException exception]; + + return (long long)-value; + } else { + if (value > (unsigned long long)LLONG_MAX) + @throw [OFOutOfRangeException exception]; + + return (long long)value; + } } - (unsigned long long)unsignedLongLongValue diff --git a/tests/OFStringTests.m b/tests/OFStringTests.m index c6b11903d..b866a8383 100644 --- a/tests/OFStringTests.m +++ b/tests/OFStringTests.m @@ -749,6 +749,10 @@ static const char *range80ToFF = OTAssertEqual([[self.stringClass stringWithString: @"\t\t\r\n"] longLongValueWithBase: 8], 0); + + OTAssertEqual([[self.stringClass stringWithString: + ([OFString stringWithFormat: @"%lld", LLONG_MIN])] longLongValue], + LLONG_MIN); } - (void)testLongLongValueThrowsOnInvalidFormat