Am 06.08.2015 um 18:10 schrieb stef...@apache.org:
Author: stefan2
Date: Thu Aug 6 16:10:39 2015
New Revision: 1694533
URL: http://svn.apache.org/r1694533
Log:
Fix an alignment problem on machines with 32 bit pointers but atomic 64
data access that may not be misaligned.
* subversion/libsvn_ra_svn/marshal.c
(read_item): Ensure that the array contents are always have the APR
default alignment.
Found by: Rainer Jung <rainer.jung{_AT_}kippdata.de>
Modified:
subversion/trunk/subversion/libsvn_ra_svn/marshal.c
Modified: subversion/trunk/subversion/libsvn_ra_svn/marshal.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_ra_svn/marshal.c?rev=1694533&r1=1694532&r2=1694533&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_ra_svn/marshal.c (original)
+++ subversion/trunk/subversion/libsvn_ra_svn/marshal.c Thu Aug 6 16:10:39 2015
@@ -1190,14 +1190,20 @@ static svn_error_t *read_item(svn_ra_svn
}
else if (c == '(')
{
+ /* On machines with 32 bit pointers, array headers are only 20 bytes
+ * which is not enough for our standard 64 bit alignment.
+ * So, determine a suitable block size for the APR array header that
+ * keeps proper alignment for following structs. */
+ const apr_size_t header_size
+ = APR_ALIGN_DEFAULT(sizeof(apr_array_header_t));
+
/* Allocate an APR array with room for (initially) 4 items.
* We do this manually because lists are the most frequent protocol
* element, often used to frame a single, optional value. We save
* about 20% of total protocol handling time. */
- char *buffer = apr_palloc(pool, sizeof(apr_array_header_t)
- + 4 * sizeof(svn_ra_svn_item_t));
- svn_ra_svn_item_t *data
- = (svn_ra_svn_item_t *)(buffer + sizeof(apr_array_header_t));
+ char *buffer = apr_palloc(pool,
+ header_size + 4 * sizeof(svn_ra_svn_item_t));
+ svn_ra_svn_item_t *data = (svn_ra_svn_item_t *)(buffer + header_size);
item->kind = SVN_RA_SVN_LIST;
item->u.list = (apr_array_header_t *)buffer;
Thanks, great.
Regards,
Rainer