Index: src/OFDataArray.m ================================================================== --- src/OFDataArray.m +++ src/OFDataArray.m @@ -645,11 +645,11 @@ size = newSize; } - (void)removeItemsInRange: (of_range_t)range { - size_t newSize, lastPageByte; + size_t pageSize, newSize; if (range.length > SIZE_MAX - range.location || range.location + range.length > count) @throw [OFOutOfRangeException exceptionWithClass: [self class]]; @@ -656,31 +656,37 @@ memmove(items + range.location * itemSize, items + (range.location + range.length) * itemSize, (count - range.location - range.length) * itemSize); count -= range.length; - lastPageByte = [OFSystemInfo pageSize] - 1; - newSize = (count * itemSize + lastPageByte) & ~lastPageByte; + pageSize = [OFSystemInfo pageSize]; + newSize = (count * itemSize + pageSize - 1) & ~(pageSize - 1); + + if (size != newSize && newSize >= pageSize) { + @try { + items = [self resizeMemory: items + size: newSize]; + } @catch (OFOutOfMemoryException *e) { + /* We don't care, as we only made it smaller */ + } - if (size != newSize) - items = [self resizeMemory: items - size: newSize]; - size = newSize; + size = newSize; + } } - (void)removeLastItem { - size_t newSize, lastPageByte; + size_t pageSize, newSize; if (count == 0) return; count--; - lastPageByte = [OFSystemInfo pageSize] - 1; - newSize = (count * itemSize + lastPageByte) & ~lastPageByte; + pageSize = [OFSystemInfo pageSize]; + newSize = (count * itemSize + pageSize - 1) & ~(pageSize - 1); - if (size != newSize) { + if (size != newSize && newSize >= pageSize) { @try { items = [self resizeMemory: items size: newSize]; } @catch (OFOutOfMemoryException *e) { /* We don't care, as we only made it smaller */ @@ -690,12 +696,18 @@ } } - (void)removeAllItems { - [self freeMemory: items]; + size_t pageSize = [OFSystemInfo pageSize]; + + @try { + items = [self resizeMemory: items + size: pageSize]; + size = pageSize; + } @catch (OFOutOfMemoryException *e) { + /* We don't care, as we only made it smaller */ + } - items = NULL; count = 0; - size = 0; } @end