Don't assume the size when allocating a CFNumber #977
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
CoreFoundation assumed the size of a
struct __CFNumber
(which contains aCFRuntimeBase
and anint64_t
) would be the size of aCFRuntimeBase
plus 8 bytes.This assumption may be true on some platforms, but on my Raspberry Pi, the size of a
CFRuntimeBase
was 20 bytes. The compiler inserted four bytes of padding before theint64_t
to align it to an 8-byte boundary, causing the structure to take up 32 bytes instead of the 28 bytes the code allocated. Writing to theint64_t
overwrote some ofmalloc
's internal bookkeeping information and caused a crash.I changed the code to use a couple of
sizeof
s to calculate the extra space to allocate, like the rest of CoreFoundation does (see this search).