about summary refs log tree commit diff
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)
downloadglibc-b15549e6f8d5936c4312b022ac8910823f2c2280.tar.gz
glibc-b15549e6f8d5936c4312b022ac8910823f2c2280.tar.xz
glibc-b15549e6f8d5936c4312b022ac8910823f2c2280.zip
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)