[patch] fix for strcat and strncat on the SPU

Kazunori Asayama asayama@sm.sony.co.jp
Mon Jun 9 17:15:00 GMT 2008


Ken Werner wrote:
> the SPU implementation of strcat and strncat modifies the dst pointer. The 
> following test would return SIGABRT on the SPU if build with -fno-builtin:
> #include <string.h>
> #include <stdlib.h>
> #include <stdio.h>
> int main (int argc, char* argv[])
> {
>   char dst[64];
>   strcpy (dst, "hello world");
>   if (strcat (dst, "foo") != dst)
>     abort ();
>   return 0;
> }
> 
> This patch fixes that. Ok to apply?
> 
> Ken
> 
> newlib/ChangeLog:
> 
> 2008-06-06  Ken Werner  <ken.werner@de.ibm.com>
> 
>         * libc/machine/spu/strcat.c: Return value fixed.
>         * libc/machine/spu/strncat.c: Likewise.
> 
> Index: src/newlib/libc/machine/spu/strcat.c
> ===================================================================
> --- src.orig/newlib/libc/machine/spu/strcat.c
> +++ src/newlib/libc/machine/spu/strcat.c
> @@ -41,5 +41,7 @@
>   */
>  char *strcat(char * __restrict__ dest, const char * __restrict__ src)
>  {
> -  return _strncpy(_straddr(dest), src, 0, 0, 0);
> +  char *ret = dest;
> +  _strncpy(_straddr(dest), src, 0, 0, 0);
> +  return ret;
>  }

It seems to be sufficient to just return 'dest' instead of 'ret'. The 
_straddr(dest) may return a different value from 'dest', however it 
never modifies the original 'dest'.

> Index: src/newlib/libc/machine/spu/strncat.c
> ===================================================================
> --- src.orig/newlib/libc/machine/spu/strncat.c
> +++ src/newlib/libc/machine/spu/strncat.c
> @@ -41,5 +41,7 @@
>  char * strncat(char * __restrict__ dest, const char * __restrict__ src,
>                 size_t n)
>  {
> -  return _strncpy(_straddr(dest), src, n, 1, 1);
> +  char *ret = dest;
> +  _strncpy(_straddr(dest), src, n, 1, 1);
> +  return ret;
>  }

Likewise.

-- 
(ASAYAMA Kazunori
   (asayama@sm.sony.co.jp))
t



More information about the Newlib mailing list