Index: src/OFUTF8String.m ================================================================== --- src/OFUTF8String.m +++ src/OFUTF8String.m @@ -1155,10 +1155,11 @@ - (const OFUnichar *)characters { OFUnichar *buffer = OFAllocMemory(_s->length, sizeof(OFUnichar)); size_t i = 0, j = 0; + const OFUnichar *ret; while (i < _s->cStringLength) { OFUnichar c; ssize_t cLen; @@ -1172,20 +1173,28 @@ buffer[j++] = c; i += cLen; } - return [[OFData dataWithItemsNoCopy: buffer - count: _s->length - itemSize: sizeof(OFUnichar) - freeWhenDone: true] items]; + @try { + ret = [[OFData dataWithItemsNoCopy: buffer + count: _s->length + itemSize: sizeof(OFUnichar) + freeWhenDone: true] items]; + } @catch (id e) { + OFFreeMemory(buffer); + @throw e; + } + + return ret; } - (const OFChar32 *)UTF32StringWithByteOrder: (OFByteOrder)byteOrder { OFChar32 *buffer = OFAllocMemory(_s->length + 1, sizeof(OFChar32)); size_t i = 0, j = 0; + const OFChar32 *ret; while (i < _s->cStringLength) { OFChar32 c; ssize_t cLen; @@ -1204,14 +1213,21 @@ i += cLen; } buffer[j] = 0; - return [[OFData dataWithItemsNoCopy: buffer - count: _s->length + 1 - itemSize: sizeof(OFChar32) - freeWhenDone: true] items]; + @try { + ret = [[OFData dataWithItemsNoCopy: buffer + count: _s->length + 1 + itemSize: sizeof(OFChar32) + freeWhenDone: true] items]; + } @catch (id e) { + OFFreeMemory(buffer); + @throw e; + } + + return ret; } #ifdef OF_HAVE_BLOCKS - (void)enumerateLinesUsingBlock: (OFStringLineEnumerationBlock)block {