On Mar 22, 2012, at 2:12 AM, Seth Willits wrote:

> On Mar 21, 2012, at 10:49 PM, Seth Willits wrote:
> 
>> On Mar 21, 2012, at 6:00 PM, Grandinetti Philip wrote:
>> 
>>> I am confused about different behavior I'm seeing with CFData and NSData.   
>>>  If I create a new project in XCode 4.3.1 as a Core Foundation command line 
>>> tool, and enter the code below…
>> 
>> You've triggered a bug!
>> 
>> And it took me a long time, but I found it. The bug is in 
>> __CFDataRoundUpCapacity, and has to do with a bad (1 << ….) which should be 
>> (1L << …).
>> 
>> I'll file a report.
> 
> Filed as 11097403. And yeah, setting the length to anything > 0 when the data 
> is created will avoid the bug because the CFData is not  "growable", and 
> CFDataSetLength is handled a little different for growable CFDatas vs 
> fixed-length mutable ones.
> 
> I'm not sure what [NSMutableData dataWithCapacity:0] does, but it's not a 
> simple call to CFDataCreateMutable(kCFAllocatorDefault, 0) which is why it 
> behaves differently as well. 


Calling CFDataSetLength() (or CFDataIncreaseLength(), which simply calls 
through to CFDataSetLength()) on a non-growable CFMutableData() short-circuits 
the problematic __CFDataGrow() -> __CFDataRoundUpCapacity() call chain, but 
there's an interesting side effect. Because CFAssert is #defined out on 
non-debug builds of CoreFoundation, the function exits the if loop, but still 
calls __CFDataSetLength() and __CFDataSetNumBytesUsed(). This can result in the 
length being larger than the capacity:

<CFData 0x101f13e60 [0x7fff7b99efc0]>{length = 32, capacity = 16, bytes = 0x00 
... 00}

That means that this code:

CFMutableDataRef data = CFDataCreateMutable(kCFAllocatorDefault, 16);
CFDataSetLength(data, 1ULL << 30);
CFShow(data);

will not crash or complain on the CFDataSetLength() call, but it will segfault 
on the CFShow(), as __CFDataCopyDescription() goes tramping off the end of the 
buffer.

Checking CFDataGetLength() after a bad CFDataSetLength() would lead you to 
believe you had all the requested space available. Unfortunately, there doesn't 
seem to be any way to inspect the capacity of an existing CFMutableData object.

-- 
Ben

_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to