| commit 536910724d30a38eeecd14cdbe2c93c78ea67646 |
| Author: Siddhesh Poyarekar <siddhesh@sourceware.org> |
| Date: Wed Oct 20 18:13:05 2021 +0530 |
| |
| debug: Add tests for _FORTIFY_SOURCE=3 |
| |
| Add some testing coverage for _FORTIFY_SOURCE=3. |
| |
| Signed-off-by: Siddhesh Poyarekar <siddhesh@sourceware.org> |
| Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org> |
| (cherry picked from commit ad6f2a010c2ce759936de4747f6e0d53991912f8) |
| |
| diff --git a/debug/Makefile b/debug/Makefile |
| index 6893111cbfaa0900..357f888246061e15 100644 |
| |
| |
| @@ -120,6 +120,8 @@ CFLAGS-tst-chk3.c += -Wno-format -Wno-deprecated-declarations -Wno-error |
| CFLAGS-tst-chk4.cc += -Wno-format -Wno-deprecated-declarations -Wno-error |
| CFLAGS-tst-chk5.cc += -Wno-format -Wno-deprecated-declarations -Wno-error |
| CFLAGS-tst-chk6.cc += -Wno-format -Wno-deprecated-declarations -Wno-error |
| +CFLAGS-tst-chk7.c += -Wno-format -Wno-deprecated-declarations -Wno-error |
| +CFLAGS-tst-chk8.cc += -Wno-format -Wno-deprecated-declarations -Wno-error |
| CFLAGS-tst-lfschk1.c += -Wno-format -Wno-deprecated-declarations -Wno-error |
| CFLAGS-tst-lfschk2.c += -Wno-format -Wno-deprecated-declarations -Wno-error |
| CFLAGS-tst-lfschk3.c += -Wno-format -Wno-deprecated-declarations -Wno-error |
| @@ -129,6 +131,7 @@ CFLAGS-tst-lfschk6.cc += -Wno-format -Wno-deprecated-declarations -Wno-error |
| LDLIBS-tst-chk4 = -lstdc++ |
| LDLIBS-tst-chk5 = -lstdc++ |
| LDLIBS-tst-chk6 = -lstdc++ |
| +LDLIBS-tst-chk8 = -lstdc++ |
| LDLIBS-tst-lfschk4 = -lstdc++ |
| LDLIBS-tst-lfschk5 = -lstdc++ |
| LDLIBS-tst-lfschk6 = -lstdc++ |
| @@ -150,16 +153,16 @@ CFLAGS-tst-ssp-1.c += -fstack-protector-all |
| |
| tests = backtrace-tst tst-longjmp_chk tst-chk1 tst-chk2 tst-chk3 \ |
| tst-lfschk1 tst-lfschk2 tst-lfschk3 test-strcpy_chk test-stpcpy_chk \ |
| - tst-chk4 tst-chk5 tst-chk6 tst-lfschk4 tst-lfschk5 tst-lfschk6 \ |
| - tst-longjmp_chk2 tst-backtrace2 tst-backtrace3 tst-backtrace4 \ |
| - tst-backtrace5 tst-backtrace6 |
| + tst-chk4 tst-chk5 tst-chk6 tst-chk7 tst-chk8 tst-lfschk4 tst-lfschk5 \ |
| + tst-lfschk6 tst-longjmp_chk2 tst-backtrace2 tst-backtrace3 \ |
| + tst-backtrace4 tst-backtrace5 tst-backtrace6 |
| |
| ifeq ($(have-ssp),yes) |
| tests += tst-ssp-1 |
| endif |
| |
| ifeq (,$(CXX)) |
| -tests-unsupported = tst-chk4 tst-chk5 tst-chk6 \ |
| +tests-unsupported = tst-chk4 tst-chk5 tst-chk6 tst-chk8 \ |
| tst-lfschk4 tst-lfschk5 tst-lfschk6 |
| endif |
| |
| @@ -193,6 +196,8 @@ $(objpfx)tst-chk3.out: $(gen-locales) |
| $(objpfx)tst-chk4.out: $(gen-locales) |
| $(objpfx)tst-chk5.out: $(gen-locales) |
| $(objpfx)tst-chk6.out: $(gen-locales) |
| +$(objpfx)tst-chk7.out: $(gen-locales) |
| +$(objpfx)tst-chk8.out: $(gen-locales) |
| $(objpfx)tst-lfschk1.out: $(gen-locales) |
| $(objpfx)tst-lfschk2.out: $(gen-locales) |
| $(objpfx)tst-lfschk3.out: $(gen-locales) |
| diff --git a/debug/tst-chk1.c b/debug/tst-chk1.c |
| index 6c1d32cc62c3a964..68ac00d1808382b8 100644 |
| |
| |
| @@ -83,8 +83,14 @@ handler (int sig) |
| _exit (127); |
| } |
| |
| +#if __USE_FORTIFY_LEVEL == 3 |
| +volatile size_t buf_size = 10; |
| +#else |
| char buf[10]; |
| wchar_t wbuf[10]; |
| +#define buf_size sizeof (buf) |
| +#endif |
| + |
| volatile size_t l0; |
| volatile char *p; |
| volatile wchar_t *wp; |
| @@ -123,6 +129,10 @@ int num2 = 987654; |
| static int |
| do_test (void) |
| { |
| +#if __USE_FORTIFY_LEVEL == 3 |
| + char *buf = (char *) malloc (buf_size); |
| + wchar_t *wbuf = (wchar_t *) malloc (buf_size * sizeof (wchar_t)); |
| +#endif |
| set_fortify_handler (handler); |
| |
| struct A { char buf1[9]; char buf2[1]; } a; |
| @@ -947,93 +957,93 @@ do_test (void) |
| |
| rewind (stdin); |
| |
| - if (fgets (buf, sizeof (buf), stdin) != buf |
| + if (fgets (buf, buf_size, stdin) != buf |
| || memcmp (buf, "abcdefgh\n", 10)) |
| FAIL (); |
| - if (fgets (buf, sizeof (buf), stdin) != buf || memcmp (buf, "ABCDEFGHI", 10)) |
| + if (fgets (buf, buf_size, stdin) != buf || memcmp (buf, "ABCDEFGHI", 10)) |
| FAIL (); |
| |
| rewind (stdin); |
| |
| - if (fgets (buf, l0 + sizeof (buf), stdin) != buf |
| + if (fgets (buf, l0 + buf_size, stdin) != buf |
| || memcmp (buf, "abcdefgh\n", 10)) |
| FAIL (); |
| |
| #if __USE_FORTIFY_LEVEL >= 1 |
| CHK_FAIL_START |
| - if (fgets (buf, sizeof (buf) + 1, stdin) != buf) |
| + if (fgets (buf, buf_size + 1, stdin) != buf) |
| FAIL (); |
| CHK_FAIL_END |
| |
| CHK_FAIL_START |
| - if (fgets (buf, l0 + sizeof (buf) + 1, stdin) != buf) |
| + if (fgets (buf, l0 + buf_size + 1, stdin) != buf) |
| FAIL (); |
| CHK_FAIL_END |
| #endif |
| |
| rewind (stdin); |
| |
| - if (fgets_unlocked (buf, sizeof (buf), stdin) != buf |
| + if (fgets_unlocked (buf, buf_size, stdin) != buf |
| || memcmp (buf, "abcdefgh\n", 10)) |
| FAIL (); |
| - if (fgets_unlocked (buf, sizeof (buf), stdin) != buf |
| + if (fgets_unlocked (buf, buf_size, stdin) != buf |
| || memcmp (buf, "ABCDEFGHI", 10)) |
| FAIL (); |
| |
| rewind (stdin); |
| |
| - if (fgets_unlocked (buf, l0 + sizeof (buf), stdin) != buf |
| + if (fgets_unlocked (buf, l0 + buf_size, stdin) != buf |
| || memcmp (buf, "abcdefgh\n", 10)) |
| FAIL (); |
| |
| #if __USE_FORTIFY_LEVEL >= 1 |
| CHK_FAIL_START |
| - if (fgets_unlocked (buf, sizeof (buf) + 1, stdin) != buf) |
| + if (fgets_unlocked (buf, buf_size + 1, stdin) != buf) |
| FAIL (); |
| CHK_FAIL_END |
| |
| CHK_FAIL_START |
| - if (fgets_unlocked (buf, l0 + sizeof (buf) + 1, stdin) != buf) |
| + if (fgets_unlocked (buf, l0 + buf_size + 1, stdin) != buf) |
| FAIL (); |
| CHK_FAIL_END |
| #endif |
| |
| rewind (stdin); |
| |
| - if (fread (buf, 1, sizeof (buf), stdin) != sizeof (buf) |
| + if (fread (buf, 1, buf_size, stdin) != buf_size |
| || memcmp (buf, "abcdefgh\nA", 10)) |
| FAIL (); |
| - if (fread (buf, sizeof (buf), 1, stdin) != 1 |
| + if (fread (buf, buf_size, 1, stdin) != 1 |
| || memcmp (buf, "BCDEFGHI\na", 10)) |
| FAIL (); |
| |
| rewind (stdin); |
| |
| - if (fread (buf, l0 + 1, sizeof (buf), stdin) != sizeof (buf) |
| + if (fread (buf, l0 + 1, buf_size, stdin) != buf_size |
| || memcmp (buf, "abcdefgh\nA", 10)) |
| FAIL (); |
| - if (fread (buf, sizeof (buf), l0 + 1, stdin) != 1 |
| + if (fread (buf, buf_size, l0 + 1, stdin) != 1 |
| || memcmp (buf, "BCDEFGHI\na", 10)) |
| FAIL (); |
| |
| #if __USE_FORTIFY_LEVEL >= 1 |
| CHK_FAIL_START |
| - if (fread (buf, 1, sizeof (buf) + 1, stdin) != sizeof (buf) + 1) |
| + if (fread (buf, 1, buf_size + 1, stdin) != buf_size + 1) |
| FAIL (); |
| CHK_FAIL_END |
| |
| CHK_FAIL_START |
| - if (fread (buf, sizeof (buf) + 1, l0 + 1, stdin) != 1) |
| + if (fread (buf, buf_size + 1, l0 + 1, stdin) != 1) |
| FAIL (); |
| CHK_FAIL_END |
| #endif |
| |
| rewind (stdin); |
| |
| - if (fread_unlocked (buf, 1, sizeof (buf), stdin) != sizeof (buf) |
| + if (fread_unlocked (buf, 1, buf_size, stdin) != buf_size |
| || memcmp (buf, "abcdefgh\nA", 10)) |
| FAIL (); |
| - if (fread_unlocked (buf, sizeof (buf), 1, stdin) != 1 |
| + if (fread_unlocked (buf, buf_size, 1, stdin) != 1 |
| || memcmp (buf, "BCDEFGHI\na", 10)) |
| FAIL (); |
| |
| @@ -1048,100 +1058,100 @@ do_test (void) |
| |
| rewind (stdin); |
| |
| - if (fread_unlocked (buf, l0 + 1, sizeof (buf), stdin) != sizeof (buf) |
| + if (fread_unlocked (buf, l0 + 1, buf_size, stdin) != buf_size |
| || memcmp (buf, "abcdefgh\nA", 10)) |
| FAIL (); |
| - if (fread_unlocked (buf, sizeof (buf), l0 + 1, stdin) != 1 |
| + if (fread_unlocked (buf, buf_size, l0 + 1, stdin) != 1 |
| || memcmp (buf, "BCDEFGHI\na", 10)) |
| FAIL (); |
| |
| #if __USE_FORTIFY_LEVEL >= 1 |
| CHK_FAIL_START |
| - if (fread_unlocked (buf, 1, sizeof (buf) + 1, stdin) != sizeof (buf) + 1) |
| + if (fread_unlocked (buf, 1, buf_size + 1, stdin) != buf_size + 1) |
| FAIL (); |
| CHK_FAIL_END |
| |
| CHK_FAIL_START |
| - if (fread_unlocked (buf, sizeof (buf) + 1, l0 + 1, stdin) != 1) |
| + if (fread_unlocked (buf, buf_size + 1, l0 + 1, stdin) != 1) |
| FAIL (); |
| CHK_FAIL_END |
| #endif |
| |
| lseek (fileno (stdin), 0, SEEK_SET); |
| |
| - if (read (fileno (stdin), buf, sizeof (buf) - 1) != sizeof (buf) - 1 |
| + if (read (fileno (stdin), buf, buf_size - 1) != buf_size - 1 |
| || memcmp (buf, "abcdefgh\n", 9)) |
| FAIL (); |
| - if (read (fileno (stdin), buf, sizeof (buf) - 1) != sizeof (buf) - 1 |
| + if (read (fileno (stdin), buf, buf_size - 1) != buf_size - 1 |
| || memcmp (buf, "ABCDEFGHI", 9)) |
| FAIL (); |
| |
| lseek (fileno (stdin), 0, SEEK_SET); |
| |
| - if (read (fileno (stdin), buf, l0 + sizeof (buf) - 1) != sizeof (buf) - 1 |
| + if (read (fileno (stdin), buf, l0 + buf_size - 1) != buf_size - 1 |
| || memcmp (buf, "abcdefgh\n", 9)) |
| FAIL (); |
| |
| #if __USE_FORTIFY_LEVEL >= 1 |
| CHK_FAIL_START |
| - if (read (fileno (stdin), buf, sizeof (buf) + 1) != sizeof (buf) + 1) |
| + if (read (fileno (stdin), buf, buf_size + 1) != buf_size + 1) |
| FAIL (); |
| CHK_FAIL_END |
| |
| CHK_FAIL_START |
| - if (read (fileno (stdin), buf, l0 + sizeof (buf) + 1) != sizeof (buf) + 1) |
| + if (read (fileno (stdin), buf, l0 + buf_size + 1) != buf_size + 1) |
| FAIL (); |
| CHK_FAIL_END |
| #endif |
| |
| - if (pread (fileno (stdin), buf, sizeof (buf) - 1, sizeof (buf) - 2) |
| - != sizeof (buf) - 1 |
| + if (pread (fileno (stdin), buf, buf_size - 1, buf_size - 2) |
| + != buf_size - 1 |
| || memcmp (buf, "\nABCDEFGH", 9)) |
| FAIL (); |
| - if (pread (fileno (stdin), buf, sizeof (buf) - 1, 0) != sizeof (buf) - 1 |
| + if (pread (fileno (stdin), buf, buf_size - 1, 0) != buf_size - 1 |
| || memcmp (buf, "abcdefgh\n", 9)) |
| FAIL (); |
| - if (pread (fileno (stdin), buf, l0 + sizeof (buf) - 1, sizeof (buf) - 3) |
| - != sizeof (buf) - 1 |
| + if (pread (fileno (stdin), buf, l0 + buf_size - 1, buf_size - 3) |
| + != buf_size - 1 |
| || memcmp (buf, "h\nABCDEFG", 9)) |
| FAIL (); |
| |
| #if __USE_FORTIFY_LEVEL >= 1 |
| CHK_FAIL_START |
| - if (pread (fileno (stdin), buf, sizeof (buf) + 1, 2 * sizeof (buf)) |
| - != sizeof (buf) + 1) |
| + if (pread (fileno (stdin), buf, buf_size + 1, 2 * buf_size) |
| + != buf_size + 1) |
| FAIL (); |
| CHK_FAIL_END |
| |
| CHK_FAIL_START |
| - if (pread (fileno (stdin), buf, l0 + sizeof (buf) + 1, 2 * sizeof (buf)) |
| - != sizeof (buf) + 1) |
| + if (pread (fileno (stdin), buf, l0 + buf_size + 1, 2 * buf_size) |
| + != buf_size + 1) |
| FAIL (); |
| CHK_FAIL_END |
| #endif |
| |
| - if (pread64 (fileno (stdin), buf, sizeof (buf) - 1, sizeof (buf) - 2) |
| - != sizeof (buf) - 1 |
| + if (pread64 (fileno (stdin), buf, buf_size - 1, buf_size - 2) |
| + != buf_size - 1 |
| || memcmp (buf, "\nABCDEFGH", 9)) |
| FAIL (); |
| - if (pread64 (fileno (stdin), buf, sizeof (buf) - 1, 0) != sizeof (buf) - 1 |
| + if (pread64 (fileno (stdin), buf, buf_size - 1, 0) != buf_size - 1 |
| || memcmp (buf, "abcdefgh\n", 9)) |
| FAIL (); |
| - if (pread64 (fileno (stdin), buf, l0 + sizeof (buf) - 1, sizeof (buf) - 3) |
| - != sizeof (buf) - 1 |
| + if (pread64 (fileno (stdin), buf, l0 + buf_size - 1, buf_size - 3) |
| + != buf_size - 1 |
| || memcmp (buf, "h\nABCDEFG", 9)) |
| FAIL (); |
| |
| #if __USE_FORTIFY_LEVEL >= 1 |
| CHK_FAIL_START |
| - if (pread64 (fileno (stdin), buf, sizeof (buf) + 1, 2 * sizeof (buf)) |
| - != sizeof (buf) + 1) |
| + if (pread64 (fileno (stdin), buf, buf_size + 1, 2 * buf_size) |
| + != buf_size + 1) |
| FAIL (); |
| CHK_FAIL_END |
| |
| CHK_FAIL_START |
| - if (pread64 (fileno (stdin), buf, l0 + sizeof (buf) + 1, 2 * sizeof (buf)) |
| - != sizeof (buf) + 1) |
| + if (pread64 (fileno (stdin), buf, l0 + buf_size + 1, 2 * buf_size) |
| + != buf_size + 1) |
| FAIL (); |
| CHK_FAIL_END |
| #endif |
| @@ -1179,7 +1189,7 @@ do_test (void) |
| CHK_FAIL2_END |
| |
| CHK_FAIL2_START |
| - snprintf (buf, sizeof (buf), "%3$d\n", 1, 2, 3, 4); |
| + snprintf (buf, buf_size, "%3$d\n", 1, 2, 3, 4); |
| CHK_FAIL2_END |
| |
| int sp[2]; |
| diff --git a/debug/tst-chk7.c b/debug/tst-chk7.c |
| new file mode 100644 |
| index 0000000000000000..2a7b32381268135c |
| |
| |
| @@ -0,0 +1,2 @@ |
| +#define _FORTIFY_SOURCE 3 |
| +#include "tst-chk1.c" |
| diff --git a/debug/tst-chk8.cc b/debug/tst-chk8.cc |
| new file mode 100644 |
| index 0000000000000000..2a7b32381268135c |
| |
| |
| @@ -0,0 +1,2 @@ |
| +#define _FORTIFY_SOURCE 3 |
| +#include "tst-chk1.c" |