aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog104
-rw-r--r--debug/Makefile24
-rw-r--r--debug/tst-chk1.c42
-rw-r--r--debug/tst-chk4.cc1
-rw-r--r--debug/tst-chk5.cc2
-rw-r--r--debug/tst-chk6.cc2
-rw-r--r--debug/tst-lfschk4.cc2
-rw-r--r--debug/tst-lfschk5.cc2
-rw-r--r--debug/tst-lfschk6.cc2
-rw-r--r--include/features.h3
-rw-r--r--include/stdio.h2
-rw-r--r--include/wchar.h2
-rw-r--r--io/fcntl.h3
-rw-r--r--io/sys/stat.h2
-rw-r--r--libio/bits/stdio-ldbl.h4
-rw-r--r--libio/bits/stdio.h9
-rw-r--r--libio/bits/stdio2.h84
-rw-r--r--libio/stdio.h2
-rw-r--r--math/bits/cmathcalls.h3
-rw-r--r--misc/bits/syslog-ldbl.h2
-rw-r--r--misc/bits/syslog.h19
-rw-r--r--misc/sys/cdefs.h20
-rw-r--r--misc/sys/syslog.h2
-rw-r--r--posix/unistd.h2
-rw-r--r--socket/sys/socket.h5
-rw-r--r--stdlib/stdlib.h2
-rw-r--r--string/bits/string3.h158
-rw-r--r--string/string.h2
-rw-r--r--sysdeps/alpha/fpu/bits/mathinline.h2
-rw-r--r--sysdeps/i386/fpu/bits/mathinline.h2
-rw-r--r--sysdeps/i386/i486/bits/string.h2
-rw-r--r--sysdeps/ia64/fpu/bits/mathinline.h2
-rw-r--r--sysdeps/powerpc/fpu/bits/mathinline.h2
-rw-r--r--sysdeps/s390/bits/string.h2
-rw-r--r--sysdeps/s390/fpu/bits/mathinline.h2
-rw-r--r--sysdeps/sparc/fpu/bits/mathinline.h2
-rw-r--r--sysdeps/unix/sysv/linux/sys/sysmacros.h10
-rw-r--r--sysdeps/x86_64/fpu/bits/mathinline.h2
-rw-r--r--wcsmbs/bits/wchar-ldbl.h2
-rw-r--r--wcsmbs/bits/wchar2.h76
-rw-r--r--wcsmbs/wchar.h4
41 files changed, 499 insertions, 118 deletions
diff --git a/ChangeLog b/ChangeLog
index 85b435ae74..94c7bdf58c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,107 @@
+2007-09-07 Jakub Jelinek <jakub@redhat.com>
+
+ * misc/sys/cdefs.h (__va_arg_pack): Define for GCC 4.3+.
+ * misc/bits/syslog.h (syslog): When __va_arg_pack is defined,
+ implement as __extern_always_inline function.
+ (vsyslog): Define as __extern_always_inline function unconditionally.
+ * libio/bits/stdio2.h (sprintf, snprintf, printf, fprintf):
+ When __va_arg_pack is defined, implement as __extern_always_inline
+ functions.
+ (vsprintf, vsnprintf, vprintf, vfprintf): Define as
+ __extern_always_inline functions unconditionally.
+ * libio/bits/stdio.h (vprintf): Ifdef out the inline when
+ bits/stdio2.h will be included.
+ * wcsmbs/bits/wchar2.h (__swprintf_alias): New redirect.
+ (swprintf, wprintf, fwprintf): When __va_arg_pack is defined,
+ implement as __extern_always_inline functions.
+ (vswprintf, vwprintf, vfwprintf): Define as
+ __extern_always_inline functions unconditionally.
+ * debug/tst-chk1.c (do_test): Enable remaining tests for C++.
+
+2007-09-03 Jakub Jelinek <jakub@redhat.com>
+
+ * misc/sys/cdefs.h (__extern_inline, __extern_always_inline): Only
+ define in C++ for GCC 4.3+, in C++ always use __gnu_inline__
+ attribute.
+ * include/features.h (__USE_EXTERN_INLINES): Define only when
+ __extern_inline is defined.
+ * stdlib/stdlib.h: Include bits/stdlib.h when __extern_always_inline
+ is defined instead of when not __cplusplus.
+ * misc/sys/syslog.h: Include bits/syslog.h when __extern_always_inline
+ is defined instead of when not __cplusplus.
+ * socket/sys/socket.h: Include bits/socket2.h when
+ __extern_always_inline is defined instead of when not __cplusplus.
+ * libio/stdio.h: Include bits/stdio2.h when __extern_always_inline
+ is defined instead of when not __cplusplus.
+ * posix/unistd.h: Include bits/unistd.h when __extern_always_inline
+ is defined instead of when not __cplusplus.
+ * string/string.h: Include bits/string3.h when __extern_always_inline
+ is defined instead of when not __cplusplus.
+ * wcsmbs/wchar.h: Include bits/wchar2.h when __extern_always_inline
+ is defined instead of when not __cplusplus.
+ (btowc, wctob): Don't guard the inlines with ifndef __cplusplus.
+ * io/fcntl.h: Don't include bits/fcntl2.h if __extern_always_inline
+ is not defined.
+ * misc/bits/syslog-ldbl.h: Guard *_chk stuff with
+ defined __extern_always_inline instead of !defined __cplusplus.
+ * libio/bits/stdio-ldbl.h: Likewise.
+ * wcsmbs/bits/wchar-ldbl.h: Likewise.
+ * misc/bits/syslog.h (syslog): Don't define for C++.
+ (vsyslog): Use __extern_always_inline function for C++ instead of
+ a macro.
+ * libio/bits/stdio.h (__STDIO_INLINE): Define to __extern_inline
+ whenever that macro is defined.
+ (vprintf): Don't provide the inline for C++.
+ (fread_unlocked, fwrite_unlocked): Don't define the macros for C++.
+ * libio/bits/stdio2.h (sprintf, snprintf, printf, fprintf): Don't
+ define the macros for C++.
+ (vsprintf, vsnprintf, vprintf, vfprintf): Define as
+ __extern_always_inline functions for C++.
+ * io/sys/stat.h (stat, lstat, fstat, fstatat, mknod, mknodat,
+ stat64, lstat64, fstat64, fstatat64): Don't define if not
+ __USE_EXTERN_INLINES.
+ * wcsmbs/bits/wchar2.h: Fix #error message.
+ (swprintf, wprintf, fwprintf): Don't define the macros for C++.
+ (vswprintf, vwprintf, vfwprintf): Define using
+ __extern_always_inline functions for C++.
+ * string/bits/string3.h: Don't #undef macros if __cplusplus.
+ (memcpy, memmove, mempcpy, memset, bcopy, bzero, strcpy, stpcpy,
+ strncpy, strcat, strncat): Define as __extern_always_inline
+ functions instead of macros for C++.
+ * math/bits/cmathcalls.h: Guard __extern_inline routines with
+ defined __extern_inline.
+ * sysdeps/alpha/fpu/bits/mathinline.h (__MATH_INLINE): Define
+ to __extern_inline whenever that macro is defined.
+ * sysdeps/ia64/fpu/bits/mathinline.h (__MATH_INLINE): Likewise.
+ * sysdeps/i386/fpu/bits/mathinline.h (__MATH_INLINE): Likewise.
+ * sysdeps/i386/i486/bits/string.h (__STRING_INLINE): Likewise.
+ * sysdeps/s390/bits/string.h (__STRING_INLINE): Likewise.
+ * sysdeps/s390/fpu/bits/mathinline.h (__MATH_INLINE): Likewise.
+ * sysdeps/powerpc/fpu/bits/mathinline.h (__MATH_INLINE): Likewise.
+ * sysdeps/x86_64/fpu/bits/mathinline.h (__MATH_INLINE): Likewise.
+ * sysdeps/sparc/fpu/bits/mathinline.h (__MATH_INLINE): Likewise.
+ * sysdeps/unix/sysv/linux/sys/sysmacros.h (gnu_dev_major,
+ gnu_dev_minor, gnu_dev_makedev): Remove __extern_inline from
+ prototypes. Only provide __extern_inline routines if
+ __USE_EXTERN_INLINES.
+ * debug/Makefile: Add rules to build and run tst-{,lfs}chk{4,5,6}
+ tests.
+ * debug/tst-chk1.c (do_prepare, do_test): Allow compilation as C++.
+ For now avoid some *printf tests in C++. Skip all testing
+ if __USE_FORTIFY_LEVEL is defined, but __extern_always_inline macro
+ is not.
+ * debug/tst-chk4.cc: New file.
+ * debug/tst-chk5.cc: New file.
+ * debug/tst-chk6.cc: New file.
+ * debug/tst-lfschk4.cc: New file.
+ * debug/tst-lfschk5.cc: New file.
+ * debug/tst-lfschk6.cc: New file.
+ * include/wchar.h (__vfwprintf_chk, __vswprintf_chk): Avoid
+ prototypes in C++.
+ * include/stdio.h (__sprintf_chk, __snprintf_chk, __vsprintf_chk,
+ __vsnprintf_chk, __printf_chk, __fprintf_chk, __vprintf_chk,
+ __vfprintf_chk, __fgets_unlocked_chk, __fgets_chk): Likewise.
+
2007-09-13 Ulrich Drepper <drepper@redhat.com>
* po/cs.po: Update from translation team.
diff --git a/debug/Makefile b/debug/Makefile
index 18905c366f..a2c28f9737 100644
--- a/debug/Makefile
+++ b/debug/Makefile
@@ -79,15 +79,37 @@ CFLAGS-recvfrom_chk.c = -fexceptions -fasynchronous-unwind-tables
CFLAGS-tst-chk1.c = -Wno-format
CFLAGS-tst-chk2.c = -Wno-format
CFLAGS-tst-chk3.c = -Wno-format
+CFLAGS-tst-chk4.cc = -Wno-format
+CFLAGS-tst-chk5.cc = -Wno-format
+CFLAGS-tst-chk6.cc = -Wno-format
+CFLAGS-tst-lfschk1.c = -Wno-format
+CFLAGS-tst-lfschk2.c = -Wno-format
+CFLAGS-tst-lfschk3.c = -Wno-format
+CFLAGS-tst-lfschk4.cc = -Wno-format
+CFLAGS-tst-lfschk5.cc = -Wno-format
+CFLAGS-tst-lfschk6.cc = -Wno-format
tst-chk1-ENV = LOCPATH=$(common-objpfx)localedata
tst-chk2-ENV = LOCPATH=$(common-objpfx)localedata
tst-chk3-ENV = LOCPATH=$(common-objpfx)localedata
+tst-chk4-ENV = LOCPATH=$(common-objpfx)localedata
+tst-chk5-ENV = LOCPATH=$(common-objpfx)localedata
+tst-chk6-ENV = LOCPATH=$(common-objpfx)localedata
tst-lfschk1-ENV = LOCPATH=$(common-objpfx)localedata
tst-lfschk2-ENV = LOCPATH=$(common-objpfx)localedata
tst-lfschk3-ENV = LOCPATH=$(common-objpfx)localedata
+tst-lfschk4-ENV = LOCPATH=$(common-objpfx)localedata
+tst-lfschk5-ENV = LOCPATH=$(common-objpfx)localedata
+tst-lfschk6-ENV = LOCPATH=$(common-objpfx)localedata
+LDFLAGS-tst-chk4 = -lstdc++
+LDFLAGS-tst-chk5 = -lstdc++
+LDFLAGS-tst-chk6 = -lstdc++
+LDFLAGS-tst-lfschk4 = -lstdc++
+LDFLAGS-tst-lfschk5 = -lstdc++
+LDFLAGS-tst-lfschk6 = -lstdc++
tests = backtrace-tst tst-chk1 tst-chk2 tst-chk3 \
- tst-lfschk1 tst-lfschk2 tst-lfschk3 test-strcpy_chk test-stpcpy_chk
+ tst-lfschk1 tst-lfschk2 tst-lfschk3 test-strcpy_chk test-stpcpy_chk \
+ tst-chk4 tst-chk5 tst-chk6 tst-lfschk4 tst-lfschk5 tst-lfschk6
extra-libs = libSegFault libpcprofile
extra-libs-others = $(extra-libs)
diff --git a/debug/tst-chk1.c b/debug/tst-chk1.c
index 26ace28970..78a61be53b 100644
--- a/debug/tst-chk1.c
+++ b/debug/tst-chk1.c
@@ -49,7 +49,7 @@ do_prepare (void)
}
const char *strs = "abcdefgh\nABCDEFGHI\nabcdefghij\nABCDEFGHIJ";
- if (write (temp_fd, strs, strlen (strs)) != strlen (strs))
+ if ((size_t) write (temp_fd, strs, strlen (strs)) != strlen (strs))
{
puts ("could not write test strings into file");
unlink (temp_filename);
@@ -102,7 +102,7 @@ int num2 = 987654;
chk_fail_ok = 0; \
FAIL (); \
}
-#if __USE_FORTIFY_LEVEL >= 2
+#if __USE_FORTIFY_LEVEL >= 2 && (!defined __cplusplus || defined __va_arg_pack)
#define CHK_FAIL2_START CHK_FAIL_START
#define CHK_FAIL2_END CHK_FAIL_END
#else
@@ -142,6 +142,12 @@ do_test (void)
#endif
);
+#if defined __USE_FORTIFY_LEVEL && !defined __extern_always_inline
+ printf ("Test skipped");
+ if (l0 == 0)
+ return 0;
+#endif
+
/* These ops can be done without runtime checking of object size. */
memcpy (buf, "abcdefghij", 10);
memmove (buf + 1, buf, 9);
@@ -280,7 +286,7 @@ do_test (void)
CHK_FAIL_END
CHK_FAIL_START
- p = mempcpy (buf + 6, "abcde", l0 + 5);
+ p = (char *) mempcpy (buf + 6, "abcde", l0 + 5);
CHK_FAIL_END
CHK_FAIL_START
@@ -303,6 +309,7 @@ do_test (void)
stpncpy (buf + 6, "cd", l0 + 5);
CHK_FAIL_END
+# if !defined __cplusplus || defined __va_arg_pack
CHK_FAIL_START
sprintf (buf + 8, "%d", num1);
CHK_FAIL_END
@@ -310,6 +317,7 @@ do_test (void)
CHK_FAIL_START
snprintf (buf + 8, l0 + 3, "%d", num2);
CHK_FAIL_END
+# endif
memcpy (buf, str1 + 2, l0 + 9);
CHK_FAIL_START
@@ -330,18 +338,18 @@ do_test (void)
CHK_FAIL_END
CHK_FAIL_START
- p = mempcpy (a.buf1 + 6, "abcde", l0 + 5);
+ p = (char *) mempcpy (a.buf1 + 6, "abcde", l0 + 5);
CHK_FAIL_END
CHK_FAIL_START
memset (a.buf1 + 9, 'j', l0 + 2);
CHK_FAIL_END
-#if __USE_FORTIFY_LEVEL >= 2
-# define O 0
-#else
-# define O 1
-#endif
+# if __USE_FORTIFY_LEVEL >= 2
+# define O 0
+# else
+# define O 1
+# endif
CHK_FAIL_START
strcpy (a.buf1 + (O + 4), str1 + 5);
@@ -355,6 +363,7 @@ do_test (void)
strncpy (a.buf1 + (O + 6), "X", l0 + 4);
CHK_FAIL_END
+# if !defined __cplusplus || defined __va_arg_pack
CHK_FAIL_START
sprintf (a.buf1 + (O + 7), "%d", num1);
CHK_FAIL_END
@@ -362,6 +371,7 @@ do_test (void)
CHK_FAIL_START
snprintf (a.buf1 + (O + 7), l0 + 3, "%d", num2);
CHK_FAIL_END
+# endif
memcpy (a.buf1, str1 + (3 - O), l0 + 8 + O);
CHK_FAIL_START
@@ -919,7 +929,8 @@ do_test (void)
else
{
const char *sendstr = "abcdefgh\nABCDEFGH\n0123456789\n";
- if (send (sp[0], sendstr, strlen (sendstr), 0) != strlen (sendstr))
+ if ((size_t) send (sp[0], sendstr, strlen (sendstr), 0)
+ != strlen (sendstr))
FAIL ();
char recvbuf[12];
@@ -951,29 +962,30 @@ do_test (void)
struct sockaddr_un sa_un;
sl = sizeof (sa_un);
- if (recvfrom (sp[1], recvbuf, sizeof recvbuf, MSG_PEEK, &sa_un, &sl)
+ if (recvfrom (sp[1], recvbuf, sizeof recvbuf, MSG_PEEK,
+ (struct sockaddr *) &sa_un, &sl)
!= sizeof recvbuf
|| memcmp (recvbuf, sendstr, sizeof recvbuf) != 0)
FAIL ();
sl = sizeof (sa_un);
if (recvfrom (sp[1], recvbuf + 6, l0 + sizeof recvbuf - 7, MSG_PEEK,
- &sa_un, &sl) != sizeof recvbuf - 7
+ (struct sockaddr *) &sa_un, &sl) != sizeof recvbuf - 7
|| memcmp (recvbuf + 6, sendstr, sizeof recvbuf - 7) != 0)
FAIL ();
#if __USE_FORTIFY_LEVEL >= 1
CHK_FAIL_START
sl = sizeof (sa_un);
- if (recvfrom (sp[1], recvbuf + 1, sizeof recvbuf, MSG_PEEK, &sa_un, &sl)
- != sizeof recvbuf)
+ if (recvfrom (sp[1], recvbuf + 1, sizeof recvbuf, MSG_PEEK,
+ (struct sockaddr *) &sa_un, &sl) != sizeof recvbuf)
FAIL ();
CHK_FAIL_END
CHK_FAIL_START
sl = sizeof (sa_un);
if (recvfrom (sp[1], recvbuf + 4, l0 + sizeof recvbuf - 3, MSG_PEEK,
- &sa_un, &sl) != sizeof recvbuf - 3)
+ (struct sockaddr *) &sa_un, &sl) != sizeof recvbuf - 3)
FAIL ();
CHK_FAIL_END
#endif
diff --git a/debug/tst-chk4.cc b/debug/tst-chk4.cc
new file mode 100644
index 0000000000..c82e6aac86
--- /dev/null
+++ b/debug/tst-chk4.cc
@@ -0,0 +1 @@
+#include "tst-chk1.c"
diff --git a/debug/tst-chk5.cc b/debug/tst-chk5.cc
new file mode 100644
index 0000000000..be37ce2d22
--- /dev/null
+++ b/debug/tst-chk5.cc
@@ -0,0 +1,2 @@
+#define _FORTIFY_SOURCE 1
+#include "tst-chk1.c"
diff --git a/debug/tst-chk6.cc b/debug/tst-chk6.cc
new file mode 100644
index 0000000000..38b8e4fb36
--- /dev/null
+++ b/debug/tst-chk6.cc
@@ -0,0 +1,2 @@
+#define _FORTIFY_SOURCE 2
+#include "tst-chk1.c"
diff --git a/debug/tst-lfschk4.cc b/debug/tst-lfschk4.cc
new file mode 100644
index 0000000000..f3e6d47d5e
--- /dev/null
+++ b/debug/tst-lfschk4.cc
@@ -0,0 +1,2 @@
+#define _FILE_OFFSET_BITS 64
+#include "tst-chk1.c"
diff --git a/debug/tst-lfschk5.cc b/debug/tst-lfschk5.cc
new file mode 100644
index 0000000000..95d4db1d32
--- /dev/null
+++ b/debug/tst-lfschk5.cc
@@ -0,0 +1,2 @@
+#define _FILE_OFFSET_BITS 64
+#include "tst-chk2.c"
diff --git a/debug/tst-lfschk6.cc b/debug/tst-lfschk6.cc
new file mode 100644
index 0000000000..50a1ae1258
--- /dev/null
+++ b/debug/tst-lfschk6.cc
@@ -0,0 +1,2 @@
+#define _FILE_OFFSET_BITS 64
+#include "tst-chk3.c"
diff --git a/include/features.h b/include/features.h
index 7f99741a95..18f743cb75 100644
--- a/include/features.h
+++ b/include/features.h
@@ -341,7 +341,8 @@
/* Decide whether we can define 'extern inline' functions in headers. */
#if __GNUC_PREREQ (2, 7) && defined __OPTIMIZE__ \
- && !defined __OPTIMIZE_SIZE__ && !defined __NO_INLINE__
+ && !defined __OPTIMIZE_SIZE__ && !defined __NO_INLINE__ \
+ && defined __extern_inline
# define __USE_EXTERN_INLINES 1
#endif
diff --git a/include/stdio.h b/include/stdio.h
index 748523d4d1..84b8af9da1 100644
--- a/include/stdio.h
+++ b/include/stdio.h
@@ -27,6 +27,7 @@ extern int __vsscanf (__const char *__restrict __s,
_G_va_list __arg)
__attribute__ ((__format__ (__scanf__, 2, 0)));
+#ifndef __cplusplus
extern int __sprintf_chk (char *, int, size_t, const char *, ...) __THROW;
extern int __snprintf_chk (char *, size_t, int, size_t, const char *, ...)
__THROW;
@@ -40,6 +41,7 @@ extern int __vprintf_chk (int, const char *, _G_va_list);
extern int __vfprintf_chk (FILE *, int, const char *, _G_va_list);
extern char *__fgets_unlocked_chk (char *buf, size_t size, int n, FILE *fp);
extern char *__fgets_chk (char *buf, size_t size, int n, FILE *fp);
+#endif
/* Prototypes for compatibility functions. */
extern FILE *__new_tmpfile (void);
diff --git a/include/wchar.h b/include/wchar.h
index b5f74da0f0..7651f6de29 100644
--- a/include/wchar.h
+++ b/include/wchar.h
@@ -152,6 +152,7 @@ extern int __vfwprintf (__FILE *__restrict __s,
__const wchar_t *__restrict __format,
__gnuc_va_list __arg)
/* __attribute__ ((__format__ (__wprintf__, 2, 0))) */;
+#ifndef __cplusplus
extern int __vfwprintf_chk (FILE *__restrict __s, int __flag,
const wchar_t *__restrict __format,
__gnuc_va_list __arg)
@@ -163,6 +164,7 @@ extern int __vswprintf_chk (wchar_t *__restrict __s, size_t __n,
/* __attribute__ ((__format__ (__wprintf__, 5, 0))) */;
libc_hidden_proto (__vfwprintf_chk)
libc_hidden_proto (__vswprintf_chk)
+#endif
/* Internal functions. */
extern size_t __mbsrtowcs_l (wchar_t *dst, const char **src, size_t len,
diff --git a/io/fcntl.h b/io/fcntl.h
index c89bf625bf..6bfa9fd6cf 100644
--- a/