diff options
Diffstat (limited to 'debug/tst-chk1.c')
-rw-r--r-- | debug/tst-chk1.c | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/debug/tst-chk1.c b/debug/tst-chk1.c index 487b071026..e03f3dba6d 100644 --- a/debug/tst-chk1.c +++ b/debug/tst-chk1.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +/* Copyright (C) 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Jakub Jelinek <jakub@redhat.com>, 2004. @@ -20,6 +20,7 @@ #include <assert.h> #include <fcntl.h> #include <locale.h> +#include <obstack.h> #include <paths.h> #include <setjmp.h> #include <signal.h> @@ -31,6 +32,9 @@ #include <sys/socket.h> #include <sys/un.h> +#define obstack_chunk_alloc malloc +#define obstack_chunk_free free + char *temp_filename; static void do_prepare (void); static int do_test (void); @@ -705,6 +709,36 @@ do_test (void) if (fprintf (fp, buf2 + 4, str5) != 7) FAIL (); + char *my_ptr = NULL; + strcpy (buf2 + 2, "%n%s%n"); + /* When the format string is writable and contains %n, + with -D_FORTIFY_SOURCE=2 it causes __chk_fail. */ + CHK_FAIL2_START + if (asprintf (&my_ptr, buf2, str4, &n1, str5, &n1) != 14) + FAIL (); + else + free (my_ptr); + CHK_FAIL2_END + + struct obstack obs; + obstack_init (&obs); + CHK_FAIL2_START + if (obstack_printf (&obs, buf2, str4, &n1, str5, &n1) != 14) + FAIL (); + CHK_FAIL2_END + obstack_free (&obs, NULL); + + my_ptr = NULL; + if (asprintf (&my_ptr, "%s%n%s%n", str4, &n1, str5, &n1) != 14) + FAIL (); + else + free (my_ptr); + + obstack_init (&obs); + if (obstack_printf (&obs, "%s%n%s%n", str4, &n1, str5, &n1) != 14) + FAIL (); + obstack_free (&obs, NULL); + if (freopen (temp_filename, "r", stdin) == NULL) { puts ("could not open temporary file"); |