@@ -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();