Index: src/OFArray.m ================================================================== --- src/OFArray.m +++ src/OFArray.m @@ -244,19 +244,19 @@ id *buffer = of_malloc(count, sizeof(id)); @try { [self getObjects: buffer inRange: of_range(0, count)]; + + return [OFData dataWithItemsNoCopy: buffer + count: count + itemSize: sizeof(id) + freeWhenDone: true].items; } @catch (id e) { free(buffer); @throw e; } - - return [OFData dataWithItemsNoCopy: buffer - count: count - itemSize: sizeof(id) - freeWhenDone: true].items; } - (id)copy { return [self retain]; Index: src/OFHTTPServer.m ================================================================== --- src/OFHTTPServer.m +++ src/OFHTTPServer.m @@ -145,12 +145,17 @@ firstLetter = false; tmp++; } - return [OFString stringWithUTF8StringNoCopy: cString - freeWhenDone: true]; + @try { + return [OFString stringWithUTF8StringNoCopy: cString + freeWhenDone: true]; + } @catch (id e) { + free(cString); + @throw e; + } } @implementation OFHTTPServerResponse - (instancetype)initWithSocket: (OFStreamSocket *)sock server: (OFHTTPServer *)server Index: src/OFString+URLEncoding.m ================================================================== --- src/OFString+URLEncoding.m +++ src/OFString+URLEncoding.m @@ -138,10 +138,15 @@ retCString = of_realloc(retCString, 1, i + 1); } @catch (OFOutOfMemoryException *e) { /* We don't care if it fails, as we only made it smaller. */ } - return [OFString stringWithUTF8StringNoCopy: retCString - length: i - freeWhenDone: true]; + @try { + return [OFString stringWithUTF8StringNoCopy: retCString + length: i + freeWhenDone: true]; + } @catch (id e) { + free(retCString); + @throw e; + } } @end Index: src/OFString.m ================================================================== --- src/OFString.m +++ src/OFString.m @@ -1047,15 +1047,20 @@ } @catch (id e) { [self release]; @throw e; } - if (encoding == OF_STRING_ENCODING_UTF_8) - self = [self initWithUTF8StringNoCopy: tmp - length: (size_t)fileSize - freeWhenDone: true]; - else { + if (encoding == OF_STRING_ENCODING_UTF_8) { + @try { + self = [self initWithUTF8StringNoCopy: tmp + length: (size_t)fileSize + freeWhenDone: true]; + } @catch (id e) { + free(tmp); + @throw e; + } + } else { @try { self = [self initWithCString: tmp encoding: encoding length: (size_t)fileSize]; } @finally { @@ -1433,13 +1438,18 @@ break; default: @throw [OFInvalidEncodingException exception]; } - return [OFData dataWithItemsNoCopy: cString - count: cStringLength + 1 - freeWhenDone: true].items; + @try { + return [OFData dataWithItemsNoCopy: cString + count: cStringLength + 1 + freeWhenDone: true].items; + } @catch (id e) { + free(cString); + @throw e; + } } - (const char *)cStringWithEncoding: (of_string_encoding_t)encoding { return [self of_cStringWithEncoding: encoding @@ -2503,19 +2513,19 @@ buffer = of_malloc(length, sizeof(of_unichar_t)); @try { [self getCharacters: buffer inRange: of_range(0, length)]; + + return [OFData dataWithItemsNoCopy: buffer + count: length + itemSize: sizeof(of_unichar_t) + freeWhenDone: true].items; } @catch (id e) { free(buffer); @throw e; } - - return [OFData dataWithItemsNoCopy: buffer - count: length - itemSize: sizeof(of_unichar_t) - freeWhenDone: true].items; } - (const of_char16_t *)UTF16String { return [self UTF16StringWithByteOrder: OF_BYTE_ORDER_NATIVE]; @@ -2566,14 +2576,19 @@ /* We don't care, as we only tried to make it smaller */ } objc_autoreleasePoolPop(pool); - return [OFData dataWithItemsNoCopy: buffer - count: j + 1 - itemSize: sizeof(of_char16_t) - freeWhenDone: true].items; + @try { + return [OFData dataWithItemsNoCopy: buffer + count: j + 1 + itemSize: sizeof(of_char16_t) + freeWhenDone: true].items; + } @catch (id e) { + free(buffer); + @throw e; + } } - (size_t)UTF16StringLength { const of_unichar_t *characters = self.characters; @@ -2601,23 +2616,23 @@ buffer = of_malloc(length + 1, sizeof(of_char32_t)); @try { [self getCharacters: buffer inRange: of_range(0, length)]; buffer[length] = 0; + + if (byteOrder != OF_BYTE_ORDER_NATIVE) + for (size_t i = 0; i < length; i++) + buffer[i] = OF_BSWAP32(buffer[i]); + + return [OFData dataWithItemsNoCopy: buffer + count: length + 1 + itemSize: sizeof(of_char32_t) + freeWhenDone: true].items; } @catch (id e) { free(buffer); @throw e; } - - if (byteOrder != OF_BYTE_ORDER_NATIVE) - for (size_t i = 0; i < length; i++) - buffer[i] = OF_BSWAP32(buffer[i]); - - return [OFData dataWithItemsNoCopy: buffer - count: length + 1 - itemSize: sizeof(of_char32_t) - freeWhenDone: true].items; } - (OFData *)dataWithEncoding: (of_string_encoding_t)encoding { void *pool = objc_autoreleasePoolPush();