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

Reply via email to