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);
> +        }
>      }
> }
>