On 06.08.2015 18:10, stef...@apache.org wrote:
> 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;


How exactly is all this different from:

        apr_array_make(pool, 4, sizeof(svn_ra_svn_item_t)?

Other than relying on magic knowledge of APR implementation details?

-- Brane

Reply via email to