summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@gmail.com>2012-01-24 17:40:44 -0500
committerUlrich Drepper <drepper@gmail.com>2012-01-24 17:40:44 -0500
commitb15549e6f8d5936c4312b022ac8910823f2c2280 (patch)
tree9e0a26dfb17b4e9c3cb89a38d5ec9a7f460236de
parentd220b1177777a2cd00d1b1eae62e1071a17ab46b (diff)
Fix gets problems
-rw-r--r--ChangeLog7
-rw-r--r--debug/tst-chk1.c5
-rw-r--r--include/stdio.h22
-rw-r--r--stdio-common/tst-gets.c6
4 files changed, 30 insertions, 10 deletions
diff --git a/ChangeLog b/ChangeLog
index f0f301706e..1887ec29da 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2012-01-24 Ulrich Drepper <drepper@gmail.com>
+
+ * include/stdio.h: Add C++ protection. Add gets declarations and
+ definitions.
+ * debug/tst-chk1.c: Don't declare gets here.
+ * stdio-common/tst-gets.c: Likewise.
+
2012-01-21 Ulrich Drepper <drepper@gmail.com>
* wcsmbs/uchar.h: Test __STDC_VERSION__.
diff --git a/debug/tst-chk1.c b/debug/tst-chk1.c
index 2593ab9f18..21419eec76 100644
--- a/debug/tst-chk1.c
+++ b/debug/tst-chk1.c
@@ -34,11 +34,6 @@
#include <sys/socket.h>
#include <sys/un.h>
-__BEGIN_DECLS
-/* The <stdio.h> header does not include the declaration for gets
- anymore when compiling with _GNU_SOURCE. Provide a copy here. */
-extern char *gets (char *__s);
-__END_DECLS
#define obstack_chunk_alloc malloc
#define obstack_chunk_free free
diff --git a/include/stdio.h b/include/stdio.h
index 5f4495d0d0..48aa765e02 100644
--- a/include/stdio.h
+++ b/include/stdio.h
@@ -5,6 +5,8 @@
# include <libio/stdio.h>
/* Now define the internal interfaces. */
+__BEGIN_DECLS
+
extern int __fcloseall (void);
extern int __snprintf (char *__restrict __s, size_t __maxlen,
const char *__restrict __format, ...)
@@ -164,6 +166,26 @@ libc_hidden_proto (__vfprintf_chk)
libc_hidden_proto (__vasprintf_chk)
libc_hidden_proto (__vdprintf_chk)
libc_hidden_proto (__obstack_vprintf_chk)
+
+/* The <stdio.h> header does not include the declaration for gets
+ anymore when compiling with _GNU_SOURCE. Provide a copy here. */
+extern char *gets (char *__s);
+# if __USE_FORTIFY_LEVEL > 0
+extern char *__gets_chk (char *__str, size_t) __wur;
+extern char *__REDIRECT (__gets_warn, (char *__str), gets)
+ __wur __warnattr ("please use fgets or getline instead, gets can't "
+ "specify buffer size");
+
+__extern_always_inline __wur char *
+gets (char *__str)
+{
+ if (__bos (__str) != (size_t) -1)
+ return __gets_chk (__str, __bos (__str));
+ return __gets_warn (__str);
+}
+# endif
+
+__END_DECLS
# endif
#endif
diff --git a/stdio-common/tst-gets.c b/stdio-common/tst-gets.c
index 463f345e0e..79758935d8 100644
--- a/stdio-common/tst-gets.c
+++ b/stdio-common/tst-gets.c
@@ -1,5 +1,5 @@
/* Tests for gets.
- Copyright (C) 2001, 2011 Free Software Foundation, Inc.
+ Copyright (C) 2001, 2011, 2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2001.
@@ -21,10 +21,6 @@
#include <stdio.h>
#include <string.h>
-/* The <stdio.h> header does not include the declaration for gets
- anymore when compiling with _GNU_SOURCE. Provide a copy here. */
-extern char *gets (char *__s);
-
int
main (void)