From 081f890be89f3d46e1cdca6f0fbbb1210571bab5 Mon Sep 17 00:00:00 2001 From: Frederik Carlier Date: Thu, 6 Apr 2023 20:11:35 +0000 Subject: [PATCH] `[NSData initWithBase64EncodedString]`: Fix decoding of an empty string Don't call `NSZoneRealloc` with a length of 0, but free the zone and return an empty `NSData` buffer instead. --- Source/NSData.m | 7 +++++++ Tests/base/NSData/base64.m | 6 ++++++ 2 files changed, 13 insertions(+) diff --git a/Source/NSData.m b/Source/NSData.m index ec392da64..f4fe3105e 100644 --- a/Source/NSData.m +++ b/Source/NSData.m @@ -804,6 +804,13 @@ failure: } } length = dst - result; + + if (length == 0) + { + NSZoneFree(zone, result); + return [self initWithBytesNoCopy: 0 length: 0 freeWhenDone: YES]; + } + if (options & NSDataBase64DecodingIgnoreUnknownCharacters) { /* If the decoded length is a lot shorter than expected (because we diff --git a/Tests/base/NSData/base64.m b/Tests/base/NSData/base64.m index 46524cee7..f39813fa9 100644 --- a/Tests/base/NSData/base64.m +++ b/Tests/base/NSData/base64.m @@ -127,6 +127,12 @@ int main() PASS_EQUAL(data, ref, "base64 decoding Yml0bWFya2V0cyB1c2VyIGluZGVudGl0eQ==") [data release]; + data = [[NSData alloc] initWithBase64EncodedString: @"\n" + options: NSDataBase64DecodingIgnoreUnknownCharacters]; + ref = [NSData dataWithBytes: "" length: 0]; + PASS_EQUAL(data, ref, "base64 decoding empty string") + [data release]; + [arp release]; arp = nil; return 0; }