[RFA] patch for argz_insert()

Jeff Johnston jjohnstn@redhat.com
Mon Mar 19 23:10:00 GMT 2007


Patch applied.

Thanks,

-- Jeff J.

Charles Wilson wrote:
> 2007-03-16  Charles Wilson  <cygwin@...>
> 
>     * libc/argz/argz_insert.c: before pointer is
>     invalid after *argz realloc.  Compute offset
>     between before and *argz, and use it after
>     reallocation instead.
> 
> A little algebra should demonstrate the correctness of this patch.
> 
> given:
>     delta = before - *argz
> 
> then:
>     before = *argz + delta
> 
> therefore:
>     memmove(before + len,              -> *argz + delta + len,
>             before,                    -> *argz + delta,
>             *argz + *argz_len - before ->
>                  *argz + *argz_len - *argz - delta ->
>                  *argz_len - delta
>             );
>     memcpy(before,   -> *argz + delta
>            entry,
>            len
>           );
> 
> For a more thorough description, see:
> http://cygwin.com/ml/cygwin/2007-03/msg00533.html
> 
> -- 
> Chuck
> 
> 
> 
> 
> ------------------------------------------------------------------------
> 
> Index: libc/argz/argz_insert.c
> ===================================================================
> RCS file: /cvs/src/src/newlib/libc/argz/argz_insert.c,v
> retrieving revision 1.3
> diff -u -r1.3 argz_insert.c
> --- libc/argz/argz_insert.c	8 Sep 2005 21:07:43 -0000	1.3
> +++ libc/argz/argz_insert.c	16 Mar 2007 20:00:11 -0000
> @@ -28,13 +28,16 @@
>    while (before != *argz && before[-1])
>      before--;
>  
> +  /* delta will always be non-negative, and < *argz_len */
> +  ptrdiff_t delta = before - *argz;
> +
>    len = strlen(entry) + 1;
>  
>    if(!(*argz = (char *)realloc(*argz, *argz_len + len)))
>      return ENOMEM;
>    
> -  memmove(before + len, before, *argz + *argz_len - before);
> -  memcpy(before, entry, len);
> +  memmove(*argz + delta + len, *argz + delta,  *argz_len - delta);
> +  memcpy(*argz + delta, entry, len);
>  
>    *argz_len += len;
>  



More information about the Newlib mailing list