diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2008-12-26 02:51:17 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2008-12-26 02:51:17 +0000 |
commit | 54e0a54d94c67a2d6b74e0a491920b56e1d23223 (patch) | |
tree | ecf0b9e3eed8704d6332bf276e285494c73cb104 | |
parent | 319a4ec3bf2d9306ff885f20da8e113b015c81f6 (diff) | |
download | uClibc-alpine-54e0a54d94c67a2d6b74e0a491920b56e1d23223.tar.bz2 uClibc-alpine-54e0a54d94c67a2d6b74e0a491920b56e1d23223.tar.xz |
include/libc-string_i386.h: fix a bug where memset('\xff') misbehaves
Rules.mak: add -funsigned-char, to forestall future PITA
-rw-r--r-- | Rules.mak | 4 | ||||
-rw-r--r-- | include/libc-string_i386.h | 4 |
2 files changed, 6 insertions, 2 deletions
@@ -466,9 +466,11 @@ endif NOSTDLIB_CFLAGS:=$(call check_gcc,-nostdlib,) # Some nice CFLAGS to work with +# Why -funsigned-char: I hunted a bug related to incorrect +# sign extension of 'char' type for 10 hours straight. Not fun. CFLAGS := -include $(top_builddir)include/libc-symbols.h \ $(XWARNINGS) $(CPU_CFLAGS) $(SSP_CFLAGS) \ - -fno-builtin -nostdinc -I$(top_builddir)include -I. \ + -funsigned-char -fno-builtin -nostdinc -I$(top_builddir)include -I. \ -I$(top_srcdir)libc/sysdeps/linux/$(TARGET_ARCH) # Make sure that we can be built with non-C99 compilers, too. diff --git a/include/libc-string_i386.h b/include/libc-string_i386.h index 3ed9c8783..3eefdeb76 100644 --- a/include/libc-string_i386.h +++ b/include/libc-string_i386.h @@ -26,7 +26,9 @@ void *inlined_memset_const_c_count4(void *s, unsigned eax, unsigned count) return s; } - eax *= 0x01010101; /* done at compile time */ + /* You wonder why & 0xff is needed? Try memset(p, '\xff', size). + * If char is signed, '\xff' == -1! */ + eax = (eax & 0xff) * 0x01010101; /* done at compile time */ if (count == 2) { *(short *)(s + 0) = eax; |