From: Nick Mathewson Date: Thu, 31 Jul 2008 12:18:14 +0000 (+0000) Subject: When a struct ends with char a[1], the size of all earlier members of the struct... X-Git-Tag: tor-0.2.1.3-alpha~5 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=1a76cd179a7f8db9656ac0d74438b63f8c6bc529;p=thirdparty%2Ftor.git When a struct ends with char a[1], the size of all earlier members of the struct is _not_ sizeof(st)-1; compilers add alignment. Problem spotted by rovv. Backport candidate. svn:r16302 --- diff --git a/ChangeLog b/ChangeLog index 5dfe6ec781..c815eafd25 100644 --- a/ChangeLog +++ b/ChangeLog @@ -52,6 +52,8 @@ Changes in version 0.2.1.3-alpha - 2008-07-xx HiddenServiceExcludeNodes as obsolete: they never worked properly, and nobody claims to be using them. Fixes bug 754. Bugfix on 0.1.0.1-rc. Patch from Christian Wilms. + - Fix a small alignment and memory-wasting bug on buffer chunks. Spotted + by rovv. o Minor bugfixes (controller): - When closing an application-side connection because its circuit diff --git a/src/or/buffers.c b/src/or/buffers.c index 17bd85eeae..d013ce2ffb 100644 --- a/src/or/buffers.c +++ b/src/or/buffers.c @@ -69,12 +69,14 @@ typedef struct chunk_t { * more than one byte long. */ } chunk_t; +#define CHUNK_HEADER_LEN STRUCT_OFFSET(chunk_t, mem[0]) + /** Return the number of bytes needed to allocate a chunk to hold * memlen bytes. */ -#define CHUNK_ALLOC_SIZE(memlen) (sizeof(chunk_t) + (memlen) - 1) +#define CHUNK_ALLOC_SIZE(memlen) (CHUNK_HEADER_LEN + (memlen)) /** Return the number of usable bytes in a chunk allocated with * malloc(memlen). */ -#define CHUNK_SIZE_WITH_ALLOC(memlen) ((memlen) - sizeof(chunk_t) + 1) +#define CHUNK_SIZE_WITH_ALLOC(memlen) ((memlen) - CHUNK_HEADER_LEN) /** Return the next character in chunk onto which data can be appended. * If the chunk is full, this might be off the end of chunk->mem. */