On Mon, Aug 13, 2012 at 1:27 PM, Rainer Jung <rainer.j...@kippdata.de> wrote: > On 13.08.2012 18:32, Jeff Trawick wrote: >> >> On Mon, Aug 13, 2012 at 12:30 PM, Rainer Jung <rainer.j...@kippdata.de> >> wrote: >>> >>> Hi, >>> >>> PR 53040 reveals, that mod_socache_shmcb has an alignment problem. One of >>> the three structs mapped into shm contains an apr_time_t member, which at >>> least on Sparc is 8 Bytes, whereas for 32 bit builds long is only 4 >>> Bytes. >>> >>> Currently everything is aligned for 4 Bytes, so we get bus errors/crashes >>> when trying to assign the apr_time_t to an address that is only divisible >>> by >>> 4 instead of 8. >>> >>> I can easily reproduce the problem. >>> >>> A possible solution is to pad the three structures SHMCBHeader, >>> SHMCBSubcache and SHMCBIndex to a multiple of 8 Bytes length. For >>> Subcache >>> and Index this is already true by coincidence, SHMCBHeader needs another >>> 4 >>> Bytes. >>> >>> I wonder what the right solution is. In the patch >>> >>> http://people.apache.org/~rjung/patches/mod_socache_shmcb-padding.patch >>> >>> I hard coded the padding, but I don't really like it, because it breaks >>> if >>> members are added to the struct. I could add a sizeof() test during >>> startup >>> or probably even compilation to warn or err, if the padding is wrong. >>> >>> I see several recipes for alignment using pragmas and attribute, but all >>> of >>> them are compiler specific. >>> >>> One could also wrap the struct in a wrapped struct, so that one could use >>> the sizeof() of the inner struct to determine the padding of the outer >>> struct. That would make the code convoluted. >>> >>> I checked other parts of the code, but couldn't find a simple solution. >>> Any >>> hints how to do this nicely? >> >> >> APR_ALIGN_DEFAULT? > > > I think it doesn't solve this problem, does it? It only gives me a need way > to round up sizes to multiples of 8 bytes.
It should be possible to use use APR_ALIGN_DEFAULT(sizeof(foo)) in place of sizeof(foo), instead of adding explicit padding to the structures. Any other pointer arithmetic which doesn't use sizeof(foo) would also need to use the macro. > > Regards, > > Rainer > -- Born in Roswell... married an alien... http://emptyhammock.com/