[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