mirror of
git://sourceware.org/git/glibc.git
synced 2024-11-27 03:41:23 +08:00
debug: Synchronize feature guards in fortified functions [BZ #28746]
Some functions (e.g. stpcpy, pread64, etc.) had moved to POSIX in the main headers as they got incorporated into the standard, but their fortified variants remained under __USE_GNU. As a result, these functions did not get fortified when _GNU_SOURCE was not defined. Add test wrappers that check all functions tested in tst-chk0 at all levels with _GNU_SOURCE undefined and then use the failures to (1) exclude checks for _GNU_SOURCE functions in these tests and (2) Fix feature macro guards in the fortified function headers so that they're the same as the ones in the main headers. This fixes BZ #28746. Signed-off-by: Siddhesh Poyarekar <siddhesh@sourceware.org> Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
This commit is contained in:
parent
db27f1251b
commit
fcfc908681
@ -132,6 +132,12 @@ define cflags-lfs
|
||||
CFLAGS-tst-fortify-$(1)-lfs-$(2).$(1) += -D_FILE_OFFSET_BITS=64
|
||||
endef
|
||||
|
||||
define cflags-nongnu
|
||||
CFLAGS-tst-fortify-$(1)-nongnu-$(2).$(1) += -D_LARGEFILE64_SOURCE=1
|
||||
endef
|
||||
|
||||
src-chk-nongnu = \#undef _GNU_SOURCE
|
||||
|
||||
# We know these tests have problems with format strings, this is what
|
||||
# we are testing. Disable that warning. They are also testing
|
||||
# deprecated functions (notably gets) so disable that warning as well.
|
||||
@ -145,13 +151,13 @@ CFLAGS-tst-fortify-$(1)-$(2)-$(3).$(1) += -D_FORTIFY_SOURCE=$(3) -Wno-format \
|
||||
$(eval $(call cflags-$(2),$(1),$(3)))
|
||||
$(objpfx)tst-fortify-$(1)-$(2)-$(3).$(1): tst-fortify.c Makefile
|
||||
( echo "/* Autogenerated from Makefile. */"; \
|
||||
echo ""; \
|
||||
echo "$(src-chk-$(2))"; \
|
||||
echo "#include \"tst-fortify.c\"" ) > $$@.tmp
|
||||
mv $$@.tmp $$@
|
||||
endef
|
||||
|
||||
chk-extensions = c cc
|
||||
chk-types = default lfs
|
||||
chk-types = default lfs nongnu
|
||||
chk-levels = 1 2 3
|
||||
|
||||
$(foreach e,$(chk-extensions), \
|
||||
|
@ -1,4 +1,5 @@
|
||||
/* Copyright (C) 2004-2022 Free Software Foundation, Inc.
|
||||
Copyright The GNU Toolchain Authors.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
@ -36,6 +37,17 @@
|
||||
#include <sys/socket.h>
|
||||
#include <sys/un.h>
|
||||
|
||||
#ifndef _GNU_SOURCE
|
||||
# define MEMPCPY memcpy
|
||||
# define WMEMPCPY wmemcpy
|
||||
# define MEMPCPY_RET(x) 0
|
||||
# define WMEMPCPY_RET(x) 0
|
||||
#else
|
||||
# define MEMPCPY mempcpy
|
||||
# define WMEMPCPY wmempcpy
|
||||
# define MEMPCPY_RET(x) __builtin_strlen (x)
|
||||
# define WMEMPCPY_RET(x) wcslen (x)
|
||||
#endif
|
||||
|
||||
#define obstack_chunk_alloc malloc
|
||||
#define obstack_chunk_free free
|
||||
@ -162,7 +174,7 @@ do_test (void)
|
||||
if (memcmp (buf, "aabcdefghi", 10))
|
||||
FAIL ();
|
||||
|
||||
if (mempcpy (buf + 5, "abcde", 5) != buf + 10
|
||||
if (MEMPCPY (buf + 5, "abcde", 5) != buf + 5 + MEMPCPY_RET ("abcde")
|
||||
|| memcmp (buf, "aabcdabcde", 10))
|
||||
FAIL ();
|
||||
|
||||
@ -207,7 +219,7 @@ do_test (void)
|
||||
if (memcmp (buf, "aabcdefghi", 10))
|
||||
FAIL ();
|
||||
|
||||
if (mempcpy (buf + 5, "abcde", l0 + 5) != buf + 10
|
||||
if (MEMPCPY (buf + 5, "abcde", l0 + 5) != buf + 5 + MEMPCPY_RET ("abcde")
|
||||
|| memcmp (buf, "aabcdabcde", 10))
|
||||
FAIL ();
|
||||
|
||||
@ -266,7 +278,8 @@ do_test (void)
|
||||
if (memcmp (a.buf1, "aabcdefghi", 10))
|
||||
FAIL ();
|
||||
|
||||
if (mempcpy (a.buf1 + 5, "abcde", l0 + 5) != a.buf1 + 10
|
||||
if (MEMPCPY (a.buf1 + 5, "abcde", l0 + 5)
|
||||
!= a.buf1 + 5 + MEMPCPY_RET ("abcde")
|
||||
|| memcmp (a.buf1, "aabcdabcde", 10))
|
||||
FAIL ();
|
||||
|
||||
@ -347,6 +360,7 @@ do_test (void)
|
||||
bcopy (buf + 1, buf + 2, l0 + 9);
|
||||
CHK_FAIL_END
|
||||
|
||||
#ifdef _GNU_SOURCE
|
||||
CHK_FAIL_START
|
||||
p = (char *) mempcpy (buf + 6, "abcde", 5);
|
||||
CHK_FAIL_END
|
||||
@ -354,6 +368,7 @@ do_test (void)
|
||||
CHK_FAIL_START
|
||||
p = (char *) mempcpy (buf + 6, "abcde", l0 + 5);
|
||||
CHK_FAIL_END
|
||||
#endif
|
||||
|
||||
CHK_FAIL_START
|
||||
memset (buf + 9, 'j', 2);
|
||||
@ -464,6 +479,7 @@ do_test (void)
|
||||
bcopy (a.buf1 + 1, a.buf1 + 2, l0 + 9);
|
||||
CHK_FAIL_END
|
||||
|
||||
#ifdef _GNU_SOURCE
|
||||
CHK_FAIL_START
|
||||
p = (char *) mempcpy (a.buf1 + 6, "abcde", 5);
|
||||
CHK_FAIL_END
|
||||
@ -471,6 +487,7 @@ do_test (void)
|
||||
CHK_FAIL_START
|
||||
p = (char *) mempcpy (a.buf1 + 6, "abcde", l0 + 5);
|
||||
CHK_FAIL_END
|
||||
#endif
|
||||
|
||||
CHK_FAIL_START
|
||||
memset (a.buf1 + 9, 'j', 2);
|
||||
@ -550,7 +567,7 @@ do_test (void)
|
||||
if (wmemcmp (wbuf, L"aabcdefghi", 10))
|
||||
FAIL ();
|
||||
|
||||
if (wmempcpy (wbuf + 5, L"abcde", 5) != wbuf + 10
|
||||
if (WMEMPCPY (wbuf + 5, L"abcde", 5) != wbuf + 5 + WMEMPCPY_RET (L"abcde")
|
||||
|| wmemcmp (wbuf, L"aabcdabcde", 10))
|
||||
FAIL ();
|
||||
|
||||
@ -583,7 +600,8 @@ do_test (void)
|
||||
if (wmemcmp (wbuf, L"aabcdefghi", 10))
|
||||
FAIL ();
|
||||
|
||||
if (wmempcpy (wbuf + 5, L"abcde", l0 + 5) != wbuf + 10
|
||||
if (WMEMPCPY (wbuf + 5, L"abcde", l0 + 5)
|
||||
!= wbuf + 5 + WMEMPCPY_RET (L"abcde")
|
||||
|| wmemcmp (wbuf, L"aabcdabcde", 10))
|
||||
FAIL ();
|
||||
|
||||
@ -625,7 +643,8 @@ do_test (void)
|
||||
if (wmemcmp (wa.buf1, L"aabcdefghi", 10))
|
||||
FAIL ();
|
||||
|
||||
if (wmempcpy (wa.buf1 + 5, L"abcde", l0 + 5) != wa.buf1 + 10
|
||||
if (WMEMPCPY (wa.buf1 + 5, L"abcde", l0 + 5)
|
||||
!= wa.buf1 + 5 + WMEMPCPY_RET (L"abcde")
|
||||
|| wmemcmp (wa.buf1, L"aabcdabcde", 10))
|
||||
FAIL ();
|
||||
|
||||
@ -694,6 +713,7 @@ do_test (void)
|
||||
wmemmove (wbuf + 2, wbuf + 1, l0 + 9);
|
||||
CHK_FAIL_END
|
||||
|
||||
#ifdef _GNU_SOURCE
|
||||
CHK_FAIL_START
|
||||
wp = wmempcpy (wbuf + 6, L"abcde", 5);
|
||||
CHK_FAIL_END
|
||||
@ -701,6 +721,7 @@ do_test (void)
|
||||
CHK_FAIL_START
|
||||
wp = wmempcpy (wbuf + 6, L"abcde", l0 + 5);
|
||||
CHK_FAIL_END
|
||||
#endif
|
||||
|
||||
CHK_FAIL_START
|
||||
wmemset (wbuf + 9, L'j', 2);
|
||||
@ -768,6 +789,7 @@ do_test (void)
|
||||
wmemmove (wa.buf1 + 2, wa.buf1 + 1, l0 + 9);
|
||||
CHK_FAIL_END
|
||||
|
||||
#ifdef _GNU_SOURCE
|
||||
CHK_FAIL_START
|
||||
wp = wmempcpy (wa.buf1 + 6, L"abcde", 5);
|
||||
CHK_FAIL_END
|
||||
@ -775,6 +797,7 @@ do_test (void)
|
||||
CHK_FAIL_START
|
||||
wp = wmempcpy (wa.buf1 + 6, L"abcde", l0 + 5);
|
||||
CHK_FAIL_END
|
||||
#endif
|
||||
|
||||
CHK_FAIL_START
|
||||
wmemset (wa.buf1 + 9, L'j', 2);
|
||||
@ -906,6 +929,7 @@ do_test (void)
|
||||
if (fprintf (fp, buf2 + 4, str5) != 7)
|
||||
FAIL ();
|
||||
|
||||
#ifdef _GNU_SOURCE
|
||||
char *my_ptr = NULL;
|
||||
strcpy (buf2 + 2, "%n%s%n");
|
||||
/* When the format string is writable and contains %n,
|
||||
@ -935,6 +959,7 @@ do_test (void)
|
||||
if (obstack_printf (&obs, "%s%n%s%n", str4, &n1, str5, &n1) != 14)
|
||||
FAIL ();
|
||||
obstack_free (&obs, NULL);
|
||||
#endif
|
||||
|
||||
if (freopen (temp_filename, "r", stdin) == NULL)
|
||||
{
|
||||
@ -982,6 +1007,7 @@ do_test (void)
|
||||
|
||||
rewind (stdin);
|
||||
|
||||
#ifdef _GNU_SOURCE
|
||||
if (fgets_unlocked (buf, buf_size, stdin) != buf
|
||||
|| memcmp (buf, "abcdefgh\n", 10))
|
||||
FAIL ();
|
||||
@ -1008,6 +1034,7 @@ do_test (void)
|
||||
#endif
|
||||
|
||||
rewind (stdin);
|
||||
#endif
|
||||
|
||||
if (fread (buf, 1, buf_size, stdin) != buf_size
|
||||
|| memcmp (buf, "abcdefgh\nA", 10))
|
||||
@ -1578,7 +1605,10 @@ do_test (void)
|
||||
ret = 1;
|
||||
}
|
||||
|
||||
int fd = posix_openpt (O_RDWR);
|
||||
int fd;
|
||||
|
||||
#ifdef _GNU_SOURCE
|
||||
fd = posix_openpt (O_RDWR);
|
||||
if (fd != -1)
|
||||
{
|
||||
char enough[1000];
|
||||
@ -1594,6 +1624,7 @@ do_test (void)
|
||||
#endif
|
||||
close (fd);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if PATH_MAX > 0
|
||||
confstr (_CS_GNU_LIBC_VERSION, largebuf, sizeof (largebuf));
|
||||
@ -1711,8 +1742,9 @@ do_test (void)
|
||||
poll (fds, l0 + 2, 0);
|
||||
CHK_FAIL_END
|
||||
#endif
|
||||
#ifdef _GNU_SOURCE
|
||||
ppoll (fds, 1, NULL, NULL);
|
||||
#if __USE_FORTIFY_LEVEL >= 1
|
||||
# if __USE_FORTIFY_LEVEL >= 1
|
||||
CHK_FAIL_START
|
||||
ppoll (fds, 2, NULL, NULL);
|
||||
CHK_FAIL_END
|
||||
@ -1720,6 +1752,7 @@ do_test (void)
|
||||
CHK_FAIL_START
|
||||
ppoll (fds, l0 + 2, NULL, NULL);
|
||||
CHK_FAIL_END
|
||||
# endif
|
||||
#endif
|
||||
|
||||
return ret;
|
||||
|
@ -40,7 +40,7 @@ read (int __fd, void *__buf, size_t __nbytes)
|
||||
__fd, __buf, __nbytes);
|
||||
}
|
||||
|
||||
#ifdef __USE_UNIX98
|
||||
#if defined __USE_UNIX98 || defined __USE_XOPEN2K8
|
||||
extern ssize_t __pread_chk (int __fd, void *__buf, size_t __nbytes,
|
||||
__off_t __offset, size_t __bufsize)
|
||||
__wur __attr_access ((__write_only__, 2, 3));
|
||||
|
@ -79,7 +79,7 @@ __NTH (strcpy (char *__restrict __dest, const char *__restrict __src))
|
||||
return __builtin___strcpy_chk (__dest, __src, __glibc_objsize (__dest));
|
||||
}
|
||||
|
||||
#ifdef __USE_GNU
|
||||
#ifdef __USE_XOPEN2K8
|
||||
__fortify_function char *
|
||||
__NTH (stpcpy (char *__restrict __dest, const char *__restrict __src))
|
||||
{
|
||||
@ -96,14 +96,15 @@ __NTH (strncpy (char *__restrict __dest, const char *__restrict __src,
|
||||
__glibc_objsize (__dest));
|
||||
}
|
||||
|
||||
#if __GNUC_PREREQ (4, 7) || __glibc_clang_prereq (2, 6)
|
||||
#ifdef __USE_XOPEN2K8
|
||||
# if __GNUC_PREREQ (4, 7) || __glibc_clang_prereq (2, 6)
|
||||
__fortify_function char *
|
||||
__NTH (stpncpy (char *__dest, const char *__src, size_t __n))
|
||||
{
|
||||
return __builtin___stpncpy_chk (__dest, __src, __n,
|
||||
__glibc_objsize (__dest));
|
||||
}
|
||||
#else
|
||||
# else
|
||||
extern char *__stpncpy_chk (char *__dest, const char *__src, size_t __n,
|
||||
size_t __destlen) __THROW
|
||||
__fortified_attr_access ((__write_only__, 1, 3))
|
||||
@ -119,6 +120,7 @@ __NTH (stpncpy (char *__dest, const char *__src, size_t __n))
|
||||
return __stpncpy_chk (__dest, __src, __n, __bos (__dest));
|
||||
return __stpncpy_alias (__dest, __src, __n);
|
||||
}
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
|
@ -28,7 +28,9 @@ __BEGIN_DECLS
|
||||
terminate the process on error. */
|
||||
|
||||
void xraise (int sig);
|
||||
#ifdef _GNU_SOURCE
|
||||
sighandler_t xsignal (int sig, sighandler_t handler);
|
||||
#endif
|
||||
void xsigaction (int sig, const struct sigaction *newact,
|
||||
struct sigaction *oldact);
|
||||
|
||||
|
@ -457,7 +457,7 @@ __NTH (wcsrtombs (char *__restrict __dst, const wchar_t **__restrict __src,
|
||||
}
|
||||
|
||||
|
||||
#ifdef __USE_GNU
|
||||
#ifdef __USE_XOPEN2K8
|
||||
extern size_t __mbsnrtowcs_chk (wchar_t *__restrict __dst,
|
||||
const char **__restrict __src, size_t __nmc,
|
||||
size_t __len, mbstate_t *__restrict __ps,
|
||||
|
Loading…
Reference in New Issue
Block a user