tor-scan-converter: Correctly align 64bit types

Graphics / Cairo - Uli Schlachter [znc.in] - 6 December 2014 03:25 UTC

On 32bit SPARC the scan converter was causing a SIGBUS due to an unaligned memory access while accessing an int64_t. This memory accessing was to struct quorem's rem member.

This crash occurred because the tor-scan-converter contains its own implementation of a memory pool. This implementation only guarantees an alignment of sizeof(void *), which is less than what a 64 bit type requires on 32bit platforms. This 4 byte alignment is guaranteed, because struct _pool_chunk (which is the struct that is used for managing free space) contains elements of that size and so the size of that struct is a multiple of this size as well.

This problem was introduced with commit 03c3d4b7c15.

To fix this problem, this commit introduces a int64_t member to struct _pool_chunk that marks the beginning of the free data space. Thanks to this, the compiler ensures proper alignment and sizeof(struct _pool_chunk) becomes a multiple of 8.

However, previously the end of the struct marked the beginning of the data and sizeof() was used for correctly calculating offsets to the data section. So, just adding such a member would work, but would also waste some memory. To avoid this, this commit also changes the rest of the pool implementation to accommodate.

40201f4 tor-scan-converter: Correctly align 64bit types
src/cairo-tor-scan-converter.c | 38 +++++++++++++++++++++++---------------
1 file changed, 23 insertions(+), 15 deletions(-)

Upstream: cgit.freedesktop.org


  • Share