You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by rh...@apache.org on 2013/02/14 00:22:21 UTC
svn commit: r1445980 - /subversion/trunk/subversion/libsvn_subr/sorts.c
Author: rhuijben
Date: Wed Feb 13 23:22:20 2013
New Revision: 1445980
URL: http://svn.apache.org/r1445980
Log:
* subversion/libsvn_subr/sorts.c
(svn_sort__array_reverse): Replace a debug-only assertion with an
implementation for non pointer sized array items, which I hope
we never need. But everything is better than silent memory corruption
in release mode.
Modified:
subversion/trunk/subversion/libsvn_subr/sorts.c
Modified: subversion/trunk/subversion/libsvn_subr/sorts.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_subr/sorts.c?rev=1445980&r1=1445979&r2=1445980&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_subr/sorts.c (original)
+++ subversion/trunk/subversion/libsvn_subr/sorts.c Wed Feb 13 23:22:20 2013
@@ -277,15 +277,32 @@ svn_sort__array_reverse(apr_array_header
{
int i;
- assert(array->elt_size == sizeof(void *));
+ if (array->elt_size == sizeof(void *))
+ {
+ for (i = 0; i < array->nelts / 2; i++)
+ {
+ int swap_index = array->nelts - i - 1;
+ void *tmp = APR_ARRAY_IDX(array, i, void *);
- for (i = 0; i < array->nelts / 2; i++)
+ APR_ARRAY_IDX(array, i, void *) =
+ APR_ARRAY_IDX(array, swap_index, void *);
+ APR_ARRAY_IDX(array, swap_index, void *) = tmp;
+ }
+ }
+ else
{
- int swap_index = array->nelts - i - 1;
- void *tmp = APR_ARRAY_IDX(array, i, void *);
+ size_t sz = array->elt_size;
+ char *tmp = apr_palloc(scratch_pool, sz);
+
+ for (i = 0; i < array->nelts / 2; i++)
+ {
+ int swap_index = array->nelts - i - 1;
+ char *x = array->elts + (sz * i);
+ char *y = array->elts + (sz * swap_index);
- APR_ARRAY_IDX(array, i, void *) =
- APR_ARRAY_IDX(array, swap_index, void *);
- APR_ARRAY_IDX(array, swap_index, void *) = tmp;
+ memcpy(tmp, x, sz);
+ memcpy(x, y, sz);
+ memcpy(y, tmp, sz);
+ }
}
}
Re: svn commit: r1445980 - /subversion/trunk/subversion/libsvn_subr/sorts.c
Posted by Julian Foad <ju...@btopenworld.com>.
> URL: http://svn.apache.org/r1445980
> Log:
> * subversion/libsvn_subr/sorts.c
> (svn_sort__array_reverse): Replace a debug-only assertion with an
> implementation for non pointer sized array items, which I hope
> we never need. [...]
Thanks for prioviding an implementation. I updated the doc string for you in r1446012.
- Julian
> Modified: subversion/trunk/subversion/libsvn_subr/sorts.c
> ==============================================================================
> --- subversion/trunk/subversion/libsvn_subr/sorts.c (original)
> +++ subversion/trunk/subversion/libsvn_subr/sorts.c Wed Feb 13 23:22:20 2013
> @@ -277,15 +277,32 @@ svn_sort__array_reverse(apr_array_header
> {
> int i;
>
> - assert(array->elt_size == sizeof(void *));
> + if (array->elt_size == sizeof(void *))
> + {
> + for (i = 0; i < array->nelts / 2; i++)
> + {
> + int swap_index = array->nelts - i - 1;
> + void *tmp = APR_ARRAY_IDX(array, i, void *);
>
> - for (i = 0; i < array->nelts / 2; i++)
> + APR_ARRAY_IDX(array, i, void *) =
> + APR_ARRAY_IDX(array, swap_index, void *);
> + APR_ARRAY_IDX(array, swap_index, void *) = tmp;
> + }
> + }
> + else
> {
> - int swap_index = array->nelts - i - 1;
> - void *tmp = APR_ARRAY_IDX(array, i, void *);
> + size_t sz = array->elt_size;
> + char *tmp = apr_palloc(scratch_pool, sz);
> +
> + for (i = 0; i < array->nelts / 2; i++)
> + {
> + int swap_index = array->nelts - i - 1;
> + char *x = array->elts + (sz * i);
> + char *y = array->elts + (sz * swap_index);
>
> - APR_ARRAY_IDX(array, i, void *) =
> - APR_ARRAY_IDX(array, swap_index, void *);
> - APR_ARRAY_IDX(array, swap_index, void *) = tmp;
> + memcpy(tmp, x, sz);
> + memcpy(x, y, sz);
> + memcpy(y, tmp, sz);
> + }
> }
> }
>