mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-23 13:30:06 +00:00
Implement strlcpy and strlcat [BZ #178]
These functions are about to be added to POSIX, under Austin Group issue 986. The fortified strlcat implementation does not raise SIGABRT if the destination buffer does not contain a null terminator, it just inherits the non-failing regular strlcat behavior. Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
This commit is contained in:
parent
7ba426a111
commit
454a20c875
3
NEWS
3
NEWS
@ -35,6 +35,9 @@ Major new features:
|
||||
The symbol names follow the AArch64 vector ABI, they are declared
|
||||
in math.h and have to be called manually at this point.
|
||||
|
||||
* The strlcpy and strlcat functions have been added. They are derived
|
||||
from OpenBSD, and are expected to be added to a future POSIX version.
|
||||
|
||||
Deprecated and removed features, and other changes affecting compatibility:
|
||||
|
||||
* In the Linux kernel for the hppa/parisc architecture some of the
|
||||
|
@ -84,6 +84,8 @@ routines = \
|
||||
stpncpy_chk \
|
||||
strcat_chk \
|
||||
strcpy_chk \
|
||||
strlcat_chk \
|
||||
strlcpy_chk \
|
||||
strncat_chk \
|
||||
strncpy_chk \
|
||||
swprintf_chk \
|
||||
|
@ -58,6 +58,10 @@ libc {
|
||||
GLIBC_2.25 {
|
||||
__explicit_bzero_chk;
|
||||
}
|
||||
GLIBC_2.38 {
|
||||
__strlcat_chk;
|
||||
__strlcpy_chk;
|
||||
}
|
||||
GLIBC_PRIVATE {
|
||||
__fortify_fail;
|
||||
}
|
||||
|
31
debug/strlcat_chk.c
Normal file
31
debug/strlcat_chk.c
Normal file
@ -0,0 +1,31 @@
|
||||
/* Fortified version of strlcat.
|
||||
Copyright (C) 2023 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, see
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <string.h>
|
||||
|
||||
/* Check that the user-supplied size does not exceed the
|
||||
compiler-determined size, and then forward to strlcat. */
|
||||
size_t
|
||||
__strlcat_chk (char *__restrict s1, const char *__restrict s2,
|
||||
size_t n, size_t s1len)
|
||||
{
|
||||
if (__glibc_unlikely (s1len < n))
|
||||
__chk_fail ();
|
||||
|
||||
return __strlcat (s1, s2, n);
|
||||
}
|
31
debug/strlcpy_chk.c
Normal file
31
debug/strlcpy_chk.c
Normal file
@ -0,0 +1,31 @@
|
||||
/* Fortified version of strlcpy.
|
||||
Copyright (C) 2023 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, see
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <string.h>
|
||||
|
||||
/* Check that the user-supplied size does not exceed the
|
||||
compiler-determined size, and then forward to strlcpy. */
|
||||
size_t
|
||||
__strlcpy_chk (char *__restrict s1, const char *__restrict s2,
|
||||
size_t n, size_t s1len)
|
||||
{
|
||||
if (__glibc_unlikely (s1len < n))
|
||||
__chk_fail ();
|
||||
|
||||
return __strlcpy (s1, s2, n);
|
||||
}
|
@ -535,6 +535,20 @@ do_test (void)
|
||||
strncpy (a.buf1 + (O + 6), "X", l0 + 4);
|
||||
CHK_FAIL_END
|
||||
|
||||
CHK_FAIL_START
|
||||
strlcpy (a.buf1 + (O + 6), "X", 4);
|
||||
CHK_FAIL_END
|
||||
|
||||
CHK_FAIL_START
|
||||
strlcpy (a.buf1 + (O + 6), "X", l0 + 4);
|
||||
CHK_FAIL_END
|
||||
|
||||
{
|
||||
char *volatile buf2 = buf;
|
||||
if (strlcpy (buf2, "a", sizeof (buf) + 1) != 1)
|
||||
FAIL ();
|
||||
}
|
||||
|
||||
# if !defined __cplusplus || defined __va_arg_pack
|
||||
CHK_FAIL_START
|
||||
sprintf (a.buf1 + (O + 7), "%d", num1);
|
||||
@ -558,6 +572,23 @@ do_test (void)
|
||||
CHK_FAIL_START
|
||||
strncat (a.buf1, "ZYXWV", l0 + 3);
|
||||
CHK_FAIL_END
|
||||
|
||||
memset (a.buf1, 0, sizeof (a.buf1));
|
||||
CHK_FAIL_START
|
||||
strlcat (a.buf1 + (O + 6), "X", 4);
|
||||
CHK_FAIL_END
|
||||
|
||||
memset (a.buf1, 0, sizeof (a.buf1));
|
||||
CHK_FAIL_START
|
||||
strlcat (a.buf1 + (O + 6), "X", l0 + 4);
|
||||
CHK_FAIL_END
|
||||
|
||||
{
|
||||
buf[0] = '\0';
|
||||
char *volatile buf2 = buf;
|
||||
if (strlcat (buf2, "a", sizeof (buf) + 1) != 1)
|
||||
FAIL ();
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
@ -88,6 +88,10 @@ libc_hidden_proto (__stpcpy)
|
||||
# define __stpcpy(dest, src) __builtin_stpcpy (dest, src)
|
||||
#endif
|
||||
libc_hidden_proto (__stpncpy)
|
||||
extern __typeof (strlcpy) __strlcpy;
|
||||
libc_hidden_proto (__strlcpy)
|
||||
extern __typeof (strlcat) __strlcat;
|
||||
libc_hidden_proto (__strlcat)
|
||||
libc_hidden_proto (__rawmemchr)
|
||||
libc_hidden_proto (__strcasecmp)
|
||||
libc_hidden_proto (__strcasecmp_l)
|
||||
|
@ -92,6 +92,8 @@ routines := \
|
||||
strerrorname_np \
|
||||
strfry \
|
||||
string-inlines \
|
||||
strlcat \
|
||||
strlcpy \
|
||||
strlen \
|
||||
strncase \
|
||||
strncase_l \
|
||||
@ -177,6 +179,8 @@ tests := \
|
||||
tst-inlcall \
|
||||
tst-memmove-overflow \
|
||||
tst-strfry \
|
||||
tst-strlcat \
|
||||
tst-strlcpy \
|
||||
tst-strlen \
|
||||
tst-strtok \
|
||||
tst-strtok_r \
|
||||
|
@ -92,4 +92,8 @@ libc {
|
||||
GLIBC_2.35 {
|
||||
__memcmpeq;
|
||||
}
|
||||
GLIBC_2.38 {
|
||||
strlcat;
|
||||
strlcpy;
|
||||
}
|
||||
}
|
||||
|
@ -139,4 +139,40 @@ __NTH (strncat (char *__restrict __dest, const char *__restrict __src,
|
||||
__glibc_objsize (__dest));
|
||||
}
|
||||
|
||||
#ifdef __USE_MISC
|
||||
extern size_t __strlcpy_chk (char *__dest, const char *__src, size_t __n,
|
||||
size_t __destlen) __THROW;
|
||||
extern size_t __REDIRECT_NTH (__strlcpy_alias,
|
||||
(char *__dest, const char *__src, size_t __n),
|
||||
strlcpy);
|
||||
|
||||
__fortify_function size_t
|
||||
__NTH (strlcpy (char *__restrict __dest, const char *__restrict __src,
|
||||
size_t __n))
|
||||
{
|
||||
if (__glibc_objsize (__dest) != (size_t) -1
|
||||
&& (!__builtin_constant_p (__n > __glibc_objsize (__dest))
|
||||
|| __n > __glibc_objsize (__dest)))
|
||||
return __strlcpy_chk (__dest, __src, __n, __glibc_objsize (__dest));
|
||||
return __strlcpy_alias (__dest, __src, __n);
|
||||
}
|
||||
|
||||
extern size_t __strlcat_chk (char *__dest, const char *__src, size_t __n,
|
||||
size_t __destlen) __THROW;
|
||||
extern size_t __REDIRECT_NTH (__strlcat_alias,
|
||||
(char *__dest, const char *__src, size_t __n),
|
||||
strlcat);
|
||||
|
||||
__fortify_function size_t
|
||||
__NTH (strlcat (char *__restrict __dest, const char *__restrict __src,
|
||||
size_t __n))
|
||||
{
|
||||
if (__glibc_objsize (__dest) != (size_t) -1
|
||||
&& (!__builtin_constant_p (__n > __glibc_objsize (__dest))
|
||||
|| __n > __glibc_objsize (__dest)))
|
||||
return __strlcat_chk (__dest, __src, __n, __glibc_objsize (__dest));
|
||||
return __strlcat_alias (__dest, __src, __n);
|
||||
}
|
||||
#endif /* __USE_MISC */
|
||||
|
||||
#endif /* bits/string_fortified.h */
|
||||
|
@ -501,6 +501,19 @@ extern char *stpncpy (char *__restrict __dest,
|
||||
__THROW __nonnull ((1, 2));
|
||||
#endif
|
||||
|
||||
#ifdef __USE_MISC
|
||||
/* Copy at most N - 1 characters from SRC to DEST. */
|
||||
extern size_t strlcpy (char *__restrict __dest,
|
||||
const char *__restrict __src, size_t __n)
|
||||
__THROW __nonnull ((1, 2)) __attr_access ((__write_only__, 1, 3));
|
||||
|
||||
/* Append SRC to DEST, possibly with truncation to keep the total size
|
||||
below N. */
|
||||
extern size_t strlcat (char *__restrict __dest,
|
||||
const char *__restrict __src, size_t __n)
|
||||
__THROW __nonnull ((1, 2)) __attr_access ((__read_write__, 1, 3));
|
||||
#endif
|
||||
|
||||
#ifdef __USE_GNU
|
||||
/* Compare S1 and S2 as strings holding name & indices/version numbers. */
|
||||
extern int strverscmp (const char *__s1, const char *__s2)
|
||||
|
59
string/strlcat.c
Normal file
59
string/strlcat.c
Normal file
@ -0,0 +1,59 @@
|
||||
/* Append a null-terminated string to another string, with length checking.
|
||||
Copyright (C) 2023 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, see
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
|
||||
size_t
|
||||
__strlcat (char *__restrict dest, const char *__restrict src, size_t size)
|
||||
{
|
||||
size_t src_length = strlen (src);
|
||||
|
||||
/* Our implementation strlcat supports dest == NULL if size == 0
|
||||
(for consistency with snprintf and strlcpy), but strnlen does
|
||||
not, so we have to cover this case explicitly. */
|
||||
if (size == 0)
|
||||
return src_length;
|
||||
|
||||
size_t dest_length = __strnlen (dest, size);
|
||||
if (dest_length != size)
|
||||
{
|
||||
/* Copy at most the remaining number of characters in the
|
||||
destination buffer. Leave for the NUL terminator. */
|
||||
size_t to_copy = size - dest_length - 1;
|
||||
/* But not more than what is available in the source string. */
|
||||
if (to_copy > src_length)
|
||||
to_copy = src_length;
|
||||
|
||||
char *target = dest + dest_length;
|
||||
memcpy (target, src, to_copy);
|
||||
target[to_copy] = '\0';
|
||||
}
|
||||
|
||||
/* If the sum wraps around, we have more than SIZE_MAX + 2 bytes in
|
||||
the two input strings (including both null terminators). If each
|
||||
byte in the address space can be assigned a unique size_t value
|
||||
(which the static_assert checks), then by the pigeonhole
|
||||
principle, the two input strings must overlap, which is
|
||||
undefined. */
|
||||
_Static_assert (sizeof (uintptr_t) == sizeof (size_t),
|
||||
"theoretical maximum object size covers address space");
|
||||
return dest_length + src_length;
|
||||
}
|
||||
libc_hidden_def (__strlcat)
|
||||
weak_alias (__strlcat, strlcat)
|
46
string/strlcpy.c
Normal file
46
string/strlcpy.c
Normal file
@ -0,0 +1,46 @@
|
||||
/* Copy a null-terminated string to a fixed-size buffer, with length checking.
|
||||
Copyright (C) 2023 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, see
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <string.h>
|
||||
|
||||
size_t
|
||||
__strlcpy (char *__restrict dest, const char *__restrict src, size_t size)
|
||||
{
|
||||
size_t src_length = strlen (src);
|
||||
|
||||
if (__glibc_unlikely (src_length >= size))
|
||||
{
|
||||
if (size > 0)
|
||||
{
|
||||
/* Copy the leading portion of the string. The last
|
||||
character is subsequently overwritten with the NUL
|
||||
terminator, but the destination size is usually a
|
||||
multiple of a small power of two, so writing it twice
|
||||
should be more efficient than copying an odd number of
|
||||
bytes. */
|
||||
memcpy (dest, src, size);
|
||||
dest[size - 1] = '\0';
|
||||
}
|
||||
}
|
||||
else
|
||||
/* Copy the string and its terminating NUL character. */
|
||||
memcpy (dest, src, src_length + 1);
|
||||
return src_length;
|
||||
}
|
||||
libc_hidden_def (__strlcpy)
|
||||
weak_alias (__strlcpy, strlcpy)
|
84
string/tst-strlcat.c
Normal file
84
string/tst-strlcat.c
Normal file
@ -0,0 +1,84 @@
|
||||
/* Test the strlcat function.
|
||||
Copyright (C) 2023 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, see
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <support/check.h>
|
||||
|
||||
static int
|
||||
do_test (void)
|
||||
{
|
||||
struct {
|
||||
char buf1[16];
|
||||
char buf2[16];
|
||||
} s;
|
||||
|
||||
/* Nothing is written to the destination if its size is 0. */
|
||||
memset (&s, '@', sizeof (s));
|
||||
TEST_COMPARE (strlcat (s.buf1, "", 0), 0);
|
||||
TEST_COMPARE_BLOB (&s, sizeof (s), "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", 32);
|
||||
TEST_COMPARE (strlcat (s.buf1, "Hello!", 0), 6);
|
||||
TEST_COMPARE_BLOB (&s, sizeof (s), "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", 32);
|
||||
|
||||
/* No bytes are are modified in the target buffer if the source
|
||||
string is short enough. */
|
||||
memset (&s, '@', sizeof (s));
|
||||
strcpy (s.buf1, "He");
|
||||
TEST_COMPARE (strlcat (s.buf1, "llo!", sizeof (s.buf1)), 6);
|
||||
TEST_COMPARE_BLOB (&s, sizeof (s), "Hello!\0@@@@@@@@@@@@@@@@@@@@@@@@@", 32);
|
||||
|
||||
/* A source string which fits exactly into the destination buffer is
|
||||
not truncated. */
|
||||
memset (&s, '@', sizeof (s));
|
||||
strcpy (s.buf1, "H");
|
||||
TEST_COMPARE (strlcat (s.buf1, "ello, world!!!", sizeof (s.buf1)), 15);
|
||||
TEST_COMPARE_BLOB (&s, sizeof (s),
|
||||
"Hello, world!!!\0@@@@@@@@@@@@@@@@@@@@@@@@@", 32);
|
||||
|
||||
/* A source string one character longer than the destination buffer
|
||||
is truncated by one character. The total length is returned. */
|
||||
memset (&s, '@', sizeof (s));
|
||||
strcpy (s.buf1, "Hello");
|
||||
TEST_COMPARE (strlcat (s.buf1, ", world!!!!", sizeof (s.buf1)), 16);
|
||||
TEST_COMPARE_BLOB (&s, sizeof (s),
|
||||
"Hello, world!!!\0@@@@@@@@@@@@@@@@@@@@@@@@@", 32);
|
||||
|
||||
/* An even longer source string is truncated as well, and the total
|
||||
length is returned. */
|
||||
memset (&s, '@', sizeof (s));
|
||||
strcpy (s.buf1, "Hello,");
|
||||
TEST_COMPARE (strlcat (s.buf1, " world!!!!!!!!", sizeof (s.buf1)), 20);
|
||||
TEST_COMPARE_BLOB (&s, sizeof (s),
|
||||
"Hello, world!!!\0@@@@@@@@@@@@@@@@@@@@@@@@@", 32);
|
||||
|
||||
/* A destination string which is not NUL-terminated does not result
|
||||
in any changes to the buffer. */
|
||||
memset (&s, '@', sizeof (s));
|
||||
memset (s.buf1, '$', sizeof (s.buf1));
|
||||
TEST_COMPARE (strlcat (s.buf1, "", sizeof (s.buf1)), 16);
|
||||
TEST_COMPARE_BLOB (&s, sizeof (s), "$$$$$$$$$$$$$$$$@@@@@@@@@@@@@@@@", 32);
|
||||
TEST_COMPARE (strlcat (s.buf1, "Hello!", sizeof (s.buf1)), 22);
|
||||
TEST_COMPARE_BLOB (&s, sizeof (s), "$$$$$$$$$$$$$$$$@@@@@@@@@@@@@@@@", 32);
|
||||
TEST_COMPARE (strlcat (s.buf1, "Hello, world!!!!!!!!", sizeof (s.buf1)), 36);
|
||||
TEST_COMPARE_BLOB (&s, sizeof (s), "$$$$$$$$$$$$$$$$@@@@@@@@@@@@@@@@", 32);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#include <support/test-driver.c>
|
68
string/tst-strlcpy.c
Normal file
68
string/tst-strlcpy.c
Normal file
@ -0,0 +1,68 @@
|
||||
/* Test the strlcpy function.
|
||||
Copyright (C) 2023 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, see
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <support/check.h>
|
||||
|
||||
static int
|
||||
do_test (void)
|
||||
{
|
||||
struct {
|
||||
char buf1[16];
|
||||
char buf2[16];
|
||||
} s;
|
||||
|
||||
/* Nothing is written to the destination if its size is 0. */
|
||||
memset (&s, '@', sizeof (s));
|
||||
TEST_COMPARE (strlcpy (s.buf1, "Hello!", 0), 6);
|
||||
TEST_COMPARE_BLOB (&s, sizeof (s), "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", 32);
|
||||
|
||||
/* No bytes are are modified in the target buffer if the source
|
||||
string is short enough. */
|
||||
memset (&s, '@', sizeof (s));
|
||||
TEST_COMPARE (strlcpy (s.buf1, "Hello!", sizeof (s.buf1)), 6);
|
||||
TEST_COMPARE_BLOB (&s, sizeof (s), "Hello!\0@@@@@@@@@@@@@@@@@@@@@@@@@", 32);
|
||||
|
||||
/* A source string which fits exactly into the destination buffer is
|
||||
not truncated. */
|
||||
memset (&s, '@', sizeof (s));
|
||||
TEST_COMPARE (strlcpy (s.buf1, "Hello, world!!!", sizeof (s.buf1)), 15);
|
||||
TEST_COMPARE_BLOB (&s, sizeof (s),
|
||||
"Hello, world!!!\0@@@@@@@@@@@@@@@@@@@@@@@@@", 32);
|
||||
|
||||
/* A source string one character longer than the destination buffer
|
||||
is truncated by one character. The untruncated source length is
|
||||
returned. */
|
||||
memset (&s, '@', sizeof (s));
|
||||
TEST_COMPARE (strlcpy (s.buf1, "Hello, world!!!!", sizeof (s.buf1)), 16);
|
||||
TEST_COMPARE_BLOB (&s, sizeof (s),
|
||||
"Hello, world!!!\0@@@@@@@@@@@@@@@@@@@@@@@@@", 32);
|
||||
|
||||
/* An even longer source string is truncated as well, and the
|
||||
original length is returned. */
|
||||
memset (&s, '@', sizeof (s));
|
||||
TEST_COMPARE (strlcpy (s.buf1, "Hello, world!!!!!!!!", sizeof (s.buf1)), 20);
|
||||
TEST_COMPARE_BLOB (&s, sizeof (s),
|
||||
"Hello, world!!!\0@@@@@@@@@@@@@@@@@@@@@@@@@", 32);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#include <support/test-driver.c>
|
@ -2326,6 +2326,10 @@ GLIBC_2.38 __isoc23_wcstoull F
|
||||
GLIBC_2.38 __isoc23_wcstoull_l F
|
||||
GLIBC_2.38 __isoc23_wcstoumax F
|
||||
GLIBC_2.38 __isoc23_wscanf F
|
||||
GLIBC_2.38 __strlcat_chk F
|
||||
GLIBC_2.38 __strlcpy_chk F
|
||||
GLIBC_2.38 strlcat F
|
||||
GLIBC_2.38 strlcpy F
|
||||
GLIBC_2.4 __confstr_chk F
|
||||
GLIBC_2.4 __fgets_chk F
|
||||
GLIBC_2.4 __fgets_unlocked_chk F
|
||||
|
@ -2665,3 +2665,7 @@ GLIBC_2.38 __isoc23_wcstoull F
|
||||
GLIBC_2.38 __isoc23_wcstoull_l F
|
||||
GLIBC_2.38 __isoc23_wcstoumax F
|
||||
GLIBC_2.38 __isoc23_wscanf F
|
||||
GLIBC_2.38 __strlcat_chk F
|
||||
GLIBC_2.38 __strlcpy_chk F
|
||||
GLIBC_2.38 strlcat F
|
||||
GLIBC_2.38 strlcpy F
|
||||
|
@ -2774,6 +2774,10 @@ GLIBC_2.38 __nldbl___isoc23_vsscanf F
|
||||
GLIBC_2.38 __nldbl___isoc23_vswscanf F
|
||||
GLIBC_2.38 __nldbl___isoc23_vwscanf F
|
||||
GLIBC_2.38 __nldbl___isoc23_wscanf F
|
||||
GLIBC_2.38 __strlcat_chk F
|
||||
GLIBC_2.38 __strlcpy_chk F
|
||||
GLIBC_2.38 strlcat F
|
||||
GLIBC_2.38 strlcpy F
|
||||
GLIBC_2.4 _IO_fprintf F
|
||||
GLIBC_2.4 _IO_printf F
|
||||
GLIBC_2.4 _IO_sprintf F
|
||||
|
@ -2426,3 +2426,7 @@ GLIBC_2.38 __isoc23_wcstoull F
|
||||
GLIBC_2.38 __isoc23_wcstoull_l F
|
||||
GLIBC_2.38 __isoc23_wcstoumax F
|
||||
GLIBC_2.38 __isoc23_wscanf F
|
||||
GLIBC_2.38 __strlcat_chk F
|
||||
GLIBC_2.38 __strlcpy_chk F
|
||||
GLIBC_2.38 strlcat F
|
||||
GLIBC_2.38 strlcpy F
|
||||
|
@ -546,6 +546,10 @@ GLIBC_2.38 __isoc23_wcstoull F
|
||||
GLIBC_2.38 __isoc23_wcstoull_l F
|
||||
GLIBC_2.38 __isoc23_wcstoumax F
|
||||
GLIBC_2.38 __isoc23_wscanf F
|
||||
GLIBC_2.38 __strlcat_chk F
|
||||
GLIBC_2.38 __strlcpy_chk F
|
||||
GLIBC_2.38 strlcat F
|
||||
GLIBC_2.38 strlcpy F
|
||||
GLIBC_2.4 _Exit F
|
||||
GLIBC_2.4 _IO_2_1_stderr_ D 0xa0
|
||||
GLIBC_2.4 _IO_2_1_stdin_ D 0xa0
|
||||
|
@ -543,6 +543,10 @@ GLIBC_2.38 __isoc23_wcstoull F
|
||||
GLIBC_2.38 __isoc23_wcstoull_l F
|
||||
GLIBC_2.38 __isoc23_wcstoumax F
|
||||
GLIBC_2.38 __isoc23_wscanf F
|
||||
GLIBC_2.38 __strlcat_chk F
|
||||
GLIBC_2.38 __strlcpy_chk F
|
||||
GLIBC_2.38 strlcat F
|
||||
GLIBC_2.38 strlcpy F
|
||||
GLIBC_2.4 _Exit F
|
||||
GLIBC_2.4 _IO_2_1_stderr_ D 0xa0
|
||||
GLIBC_2.4 _IO_2_1_stdin_ D 0xa0
|
||||
|
@ -2702,3 +2702,7 @@ GLIBC_2.38 __isoc23_wcstoull F
|
||||
GLIBC_2.38 __isoc23_wcstoull_l F
|
||||
GLIBC_2.38 __isoc23_wcstoumax F
|
||||
GLIBC_2.38 __isoc23_wscanf F
|
||||
GLIBC_2.38 __strlcat_chk F
|
||||
GLIBC_2.38 __strlcpy_chk F
|
||||
GLIBC_2.38 strlcat F
|
||||
GLIBC_2.38 strlcpy F
|
||||
|
@ -2651,6 +2651,10 @@ GLIBC_2.38 __isoc23_wcstoull F
|
||||
GLIBC_2.38 __isoc23_wcstoull_l F
|
||||
GLIBC_2.38 __isoc23_wcstoumax F
|
||||
GLIBC_2.38 __isoc23_wscanf F
|
||||
GLIBC_2.38 __strlcat_chk F
|
||||
GLIBC_2.38 __strlcpy_chk F
|
||||
GLIBC_2.38 strlcat F
|
||||
GLIBC_2.38 strlcpy F
|
||||
GLIBC_2.4 __confstr_chk F
|
||||
GLIBC_2.4 __fgets_chk F
|
||||
GLIBC_2.4 __fgets_unlocked_chk F
|
||||
|
@ -2835,6 +2835,10 @@ GLIBC_2.38 __isoc23_wcstoull F
|
||||
GLIBC_2.38 __isoc23_wcstoull_l F
|
||||
GLIBC_2.38 __isoc23_wcstoumax F
|
||||
GLIBC_2.38 __isoc23_wscanf F
|
||||
GLIBC_2.38 __strlcat_chk F
|
||||
GLIBC_2.38 __strlcpy_chk F
|
||||
GLIBC_2.38 strlcat F
|
||||
GLIBC_2.38 strlcpy F
|
||||
GLIBC_2.4 __confstr_chk F
|
||||
GLIBC_2.4 __fgets_chk F
|
||||
GLIBC_2.4 __fgets_unlocked_chk F
|
||||
|
@ -2600,6 +2600,10 @@ GLIBC_2.38 __isoc23_wcstoull F
|
||||
GLIBC_2.38 __isoc23_wcstoull_l F
|
||||
GLIBC_2.38 __isoc23_wcstoumax F
|
||||
GLIBC_2.38 __isoc23_wscanf F
|
||||
GLIBC_2.38 __strlcat_chk F
|
||||
GLIBC_2.38 __strlcpy_chk F
|
||||
GLIBC_2.38 strlcat F
|
||||
GLIBC_2.38 strlcpy F
|
||||
GLIBC_2.4 __confstr_chk F
|
||||
GLIBC_2.4 __fgets_chk F
|
||||
GLIBC_2.4 __fgets_unlocked_chk F
|
||||
|
@ -2186,3 +2186,7 @@ GLIBC_2.38 __isoc23_wcstoull F
|
||||
GLIBC_2.38 __isoc23_wcstoull_l F
|
||||
GLIBC_2.38 __isoc23_wcstoumax F
|
||||
GLIBC_2.38 __isoc23_wscanf F
|
||||
GLIBC_2.38 __strlcat_chk F
|
||||
GLIBC_2.38 __strlcpy_chk F
|
||||
GLIBC_2.38 strlcat F
|
||||
GLIBC_2.38 strlcpy F
|
||||
|
@ -547,6 +547,10 @@ GLIBC_2.38 __isoc23_wcstoull F
|
||||
GLIBC_2.38 __isoc23_wcstoull_l F
|
||||
GLIBC_2.38 __isoc23_wcstoumax F
|
||||
GLIBC_2.38 __isoc23_wscanf F
|
||||
GLIBC_2.38 __strlcat_chk F
|
||||
GLIBC_2.38 __strlcpy_chk F
|
||||
GLIBC_2.38 strlcat F
|
||||
GLIBC_2.38 strlcpy F
|
||||
GLIBC_2.4 _Exit F
|
||||
GLIBC_2.4 _IO_2_1_stderr_ D 0x98
|
||||
GLIBC_2.4 _IO_2_1_stdin_ D 0x98
|
||||
|
@ -2778,6 +2778,10 @@ GLIBC_2.38 __isoc23_wcstoull F
|
||||
GLIBC_2.38 __isoc23_wcstoull_l F
|
||||
GLIBC_2.38 __isoc23_wcstoumax F
|
||||
GLIBC_2.38 __isoc23_wscanf F
|
||||
GLIBC_2.38 __strlcat_chk F
|
||||
GLIBC_2.38 __strlcpy_chk F
|
||||
GLIBC_2.38 strlcat F
|
||||
GLIBC_2.38 strlcpy F
|
||||
GLIBC_2.4 __confstr_chk F
|
||||
GLIBC_2.4 __fgets_chk F
|
||||
GLIBC_2.4 __fgets_unlocked_chk F
|
||||
|
@ -2751,3 +2751,7 @@ GLIBC_2.38 __isoc23_wcstoull F
|
||||
GLIBC_2.38 __isoc23_wcstoull_l F
|
||||
GLIBC_2.38 __isoc23_wcstoumax F
|
||||
GLIBC_2.38 __isoc23_wscanf F
|
||||
GLIBC_2.38 __strlcat_chk F
|
||||
GLIBC_2.38 __strlcpy_chk F
|
||||
GLIBC_2.38 strlcat F
|
||||
GLIBC_2.38 strlcpy F
|
||||
|
@ -2748,3 +2748,7 @@ GLIBC_2.38 __isoc23_wcstoull F
|
||||
GLIBC_2.38 __isoc23_wcstoull_l F
|
||||
GLIBC_2.38 __isoc23_wcstoumax F
|
||||
GLIBC_2.38 __isoc23_wscanf F
|
||||
GLIBC_2.38 __strlcat_chk F
|
||||
GLIBC_2.38 __strlcpy_chk F
|
||||
GLIBC_2.38 strlcat F
|
||||
GLIBC_2.38 strlcpy F
|
||||
|
@ -2743,6 +2743,10 @@ GLIBC_2.38 __isoc23_wcstoull F
|
||||
GLIBC_2.38 __isoc23_wcstoull_l F
|
||||
GLIBC_2.38 __isoc23_wcstoumax F
|
||||
GLIBC_2.38 __isoc23_wscanf F
|
||||
GLIBC_2.38 __strlcat_chk F
|
||||
GLIBC_2.38 __strlcpy_chk F
|
||||
GLIBC_2.38 strlcat F
|
||||
GLIBC_2.38 strlcpy F
|
||||
GLIBC_2.4 __confstr_chk F
|
||||
GLIBC_2.4 __fgets_chk F
|
||||
GLIBC_2.4 __fgets_unlocked_chk F
|
||||
|
@ -2741,6 +2741,10 @@ GLIBC_2.38 __isoc23_wcstoull F
|
||||
GLIBC_2.38 __isoc23_wcstoull_l F
|
||||
GLIBC_2.38 __isoc23_wcstoumax F
|
||||
GLIBC_2.38 __isoc23_wscanf F
|
||||
GLIBC_2.38 __strlcat_chk F
|
||||
GLIBC_2.38 __strlcpy_chk F
|
||||
GLIBC_2.38 strlcat F
|
||||
GLIBC_2.38 strlcpy F
|
||||
GLIBC_2.4 __confstr_chk F
|
||||
GLIBC_2.4 __fgets_chk F
|
||||
GLIBC_2.4 __fgets_unlocked_chk F
|
||||
|
@ -2749,6 +2749,10 @@ GLIBC_2.38 __isoc23_wcstoull F
|
||||
GLIBC_2.38 __isoc23_wcstoull_l F
|
||||
GLIBC_2.38 __isoc23_wcstoumax F
|
||||
GLIBC_2.38 __isoc23_wscanf F
|
||||
GLIBC_2.38 __strlcat_chk F
|
||||
GLIBC_2.38 __strlcpy_chk F
|
||||
GLIBC_2.38 strlcat F
|
||||
GLIBC_2.38 strlcpy F
|
||||
GLIBC_2.4 __confstr_chk F
|
||||
GLIBC_2.4 __fgets_chk F
|
||||
GLIBC_2.4 __fgets_unlocked_chk F
|
||||
|
@ -2651,6 +2651,10 @@ GLIBC_2.38 __isoc23_wcstoull F
|
||||
GLIBC_2.38 __isoc23_wcstoull_l F
|
||||
GLIBC_2.38 __isoc23_wcstoumax F
|
||||
GLIBC_2.38 __isoc23_wscanf F
|
||||
GLIBC_2.38 __strlcat_chk F
|
||||
GLIBC_2.38 __strlcpy_chk F
|
||||
GLIBC_2.38 strlcat F
|
||||
GLIBC_2.38 strlcpy F
|
||||
GLIBC_2.4 __confstr_chk F
|
||||
GLIBC_2.4 __fgets_chk F
|
||||
GLIBC_2.4 __fgets_unlocked_chk F
|
||||
|
@ -2790,3 +2790,7 @@ GLIBC_2.38 __isoc23_wcstoull F
|
||||
GLIBC_2.38 __isoc23_wcstoull_l F
|
||||
GLIBC_2.38 __isoc23_wcstoumax F
|
||||
GLIBC_2.38 __isoc23_wscanf F
|
||||
GLIBC_2.38 __strlcat_chk F
|
||||
GLIBC_2.38 __strlcpy_chk F
|
||||
GLIBC_2.38 strlcat F
|
||||
GLIBC_2.38 strlcpy F
|
||||
|
@ -2172,3 +2172,7 @@ GLIBC_2.38 __isoc23_wcstoull F
|
||||
GLIBC_2.38 __isoc23_wcstoull_l F
|
||||
GLIBC_2.38 __isoc23_wcstoumax F
|
||||
GLIBC_2.38 __isoc23_wscanf F
|
||||
GLIBC_2.38 __strlcat_chk F
|
||||
GLIBC_2.38 __strlcpy_chk F
|
||||
GLIBC_2.38 strlcat F
|
||||
GLIBC_2.38 strlcpy F
|
||||
|
@ -2817,6 +2817,10 @@ GLIBC_2.38 __nldbl___isoc23_vsscanf F
|
||||
GLIBC_2.38 __nldbl___isoc23_vswscanf F
|
||||
GLIBC_2.38 __nldbl___isoc23_vwscanf F
|
||||
GLIBC_2.38 __nldbl___isoc23_wscanf F
|
||||
GLIBC_2.38 __strlcat_chk F
|
||||
GLIBC_2.38 __strlcpy_chk F
|
||||
GLIBC_2.38 strlcat F
|
||||
GLIBC_2.38 strlcpy F
|
||||
GLIBC_2.4 _IO_fprintf F
|
||||
GLIBC_2.4 _IO_printf F
|
||||
GLIBC_2.4 _IO_sprintf F
|
||||
|
@ -2850,6 +2850,10 @@ GLIBC_2.38 __nldbl___isoc23_vsscanf F
|
||||
GLIBC_2.38 __nldbl___isoc23_vswscanf F
|
||||
GLIBC_2.38 __nldbl___isoc23_vwscanf F
|
||||
GLIBC_2.38 __nldbl___isoc23_wscanf F
|
||||
GLIBC_2.38 __strlcat_chk F
|
||||
GLIBC_2.38 __strlcpy_chk F
|
||||
GLIBC_2.38 strlcat F
|
||||
GLIBC_2.38 strlcpy F
|
||||
GLIBC_2.4 _IO_fprintf F
|
||||
GLIBC_2.4 _IO_printf F
|
||||
GLIBC_2.4 _IO_sprintf F
|
||||
|
@ -2571,6 +2571,10 @@ GLIBC_2.38 __nldbl___isoc23_vsscanf F
|
||||
GLIBC_2.38 __nldbl___isoc23_vswscanf F
|
||||
GLIBC_2.38 __nldbl___isoc23_vwscanf F
|
||||
GLIBC_2.38 __nldbl___isoc23_wscanf F
|
||||
GLIBC_2.38 __strlcat_chk F
|
||||
GLIBC_2.38 __strlcpy_chk F
|
||||
GLIBC_2.38 strlcat F
|
||||
GLIBC_2.38 strlcpy F
|
||||
GLIBC_2.4 _IO_fprintf F
|
||||
GLIBC_2.4 _IO_printf F
|
||||
GLIBC_2.4 _IO_sprintf F
|
||||
|
@ -2885,3 +2885,7 @@ GLIBC_2.38 __nldbl___isoc23_vsscanf F
|
||||
GLIBC_2.38 __nldbl___isoc23_vswscanf F
|
||||
GLIBC_2.38 __nldbl___isoc23_vwscanf F
|
||||
GLIBC_2.38 __nldbl___isoc23_wscanf F
|
||||
GLIBC_2.38 __strlcat_chk F
|
||||
GLIBC_2.38 __strlcpy_chk F
|
||||
GLIBC_2.38 strlcat F
|
||||
GLIBC_2.38 strlcpy F
|
||||
|
@ -2428,3 +2428,7 @@ GLIBC_2.38 __isoc23_wcstoull F
|
||||
GLIBC_2.38 __isoc23_wcstoull_l F
|
||||
GLIBC_2.38 __isoc23_wcstoumax F
|
||||
GLIBC_2.38 __isoc23_wscanf F
|
||||
GLIBC_2.38 __strlcat_chk F
|
||||
GLIBC_2.38 __strlcpy_chk F
|
||||
GLIBC_2.38 strlcat F
|
||||
GLIBC_2.38 strlcpy F
|
||||
|
@ -2628,3 +2628,7 @@ GLIBC_2.38 __isoc23_wcstoull F
|
||||
GLIBC_2.38 __isoc23_wcstoull_l F
|
||||
GLIBC_2.38 __isoc23_wcstoumax F
|
||||
GLIBC_2.38 __isoc23_wscanf F
|
||||
GLIBC_2.38 __strlcat_chk F
|
||||
GLIBC_2.38 __strlcpy_chk F
|
||||
GLIBC_2.38 strlcat F
|
||||
GLIBC_2.38 strlcpy F
|
||||
|
@ -2815,6 +2815,10 @@ GLIBC_2.38 __nldbl___isoc23_vsscanf F
|
||||
GLIBC_2.38 __nldbl___isoc23_vswscanf F
|
||||
GLIBC_2.38 __nldbl___isoc23_vwscanf F
|
||||
GLIBC_2.38 __nldbl___isoc23_wscanf F
|
||||
GLIBC_2.38 __strlcat_chk F
|
||||
GLIBC_2.38 __strlcpy_chk F
|
||||
GLIBC_2.38 strlcat F
|
||||
GLIBC_2.38 strlcpy F
|
||||
GLIBC_2.4 _IO_fprintf F
|
||||
GLIBC_2.4 _IO_printf F
|
||||
GLIBC_2.4 _IO_sprintf F
|
||||
|
@ -2608,6 +2608,10 @@ GLIBC_2.38 __nldbl___isoc23_vsscanf F
|
||||
GLIBC_2.38 __nldbl___isoc23_vswscanf F
|
||||
GLIBC_2.38 __nldbl___isoc23_vwscanf F
|
||||
GLIBC_2.38 __nldbl___isoc23_wscanf F
|
||||
GLIBC_2.38 __strlcat_chk F
|
||||
GLIBC_2.38 __strlcpy_chk F
|
||||
GLIBC_2.38 strlcat F
|
||||
GLIBC_2.38 strlcpy F
|
||||
GLIBC_2.4 _IO_fprintf F
|
||||
GLIBC_2.4 _IO_printf F
|
||||
GLIBC_2.4 _IO_sprintf F
|
||||
|
@ -2658,6 +2658,10 @@ GLIBC_2.38 __isoc23_wcstoull F
|
||||
GLIBC_2.38 __isoc23_wcstoull_l F
|
||||
GLIBC_2.38 __isoc23_wcstoumax F
|
||||
GLIBC_2.38 __isoc23_wscanf F
|
||||
GLIBC_2.38 __strlcat_chk F
|
||||
GLIBC_2.38 __strlcpy_chk F
|
||||
GLIBC_2.38 strlcat F
|
||||
GLIBC_2.38 strlcpy F
|
||||
GLIBC_2.4 __confstr_chk F
|
||||
GLIBC_2.4 __fgets_chk F
|
||||
GLIBC_2.4 __fgets_unlocked_chk F
|
||||
|
@ -2655,6 +2655,10 @@ GLIBC_2.38 __isoc23_wcstoull F
|
||||
GLIBC_2.38 __isoc23_wcstoull_l F
|
||||
GLIBC_2.38 __isoc23_wcstoumax F
|
||||
GLIBC_2.38 __isoc23_wscanf F
|
||||
GLIBC_2.38 __strlcat_chk F
|
||||
GLIBC_2.38 __strlcpy_chk F
|
||||
GLIBC_2.38 strlcat F
|
||||
GLIBC_2.38 strlcpy F
|
||||
GLIBC_2.4 __confstr_chk F
|
||||
GLIBC_2.4 __fgets_chk F
|
||||
GLIBC_2.4 __fgets_unlocked_chk F
|
||||
|
@ -2810,6 +2810,10 @@ GLIBC_2.38 __nldbl___isoc23_vsscanf F
|
||||
GLIBC_2.38 __nldbl___isoc23_vswscanf F
|
||||
GLIBC_2.38 __nldbl___isoc23_vwscanf F
|
||||
GLIBC_2.38 __nldbl___isoc23_wscanf F
|
||||
GLIBC_2.38 __strlcat_chk F
|
||||
GLIBC_2.38 __strlcpy_chk F
|
||||
GLIBC_2.38 strlcat F
|
||||
GLIBC_2.38 strlcpy F
|
||||
GLIBC_2.4 _IO_fprintf F
|
||||
GLIBC_2.4 _IO_printf F
|
||||
GLIBC_2.4 _IO_sprintf F
|
||||
|
@ -2623,6 +2623,10 @@ GLIBC_2.38 __isoc23_wcstoull F
|
||||
GLIBC_2.38 __isoc23_wcstoull_l F
|
||||
GLIBC_2.38 __isoc23_wcstoumax F
|
||||
GLIBC_2.38 __isoc23_wscanf F
|
||||
GLIBC_2.38 __strlcat_chk F
|
||||
GLIBC_2.38 __strlcpy_chk F
|
||||
GLIBC_2.38 strlcat F
|
||||
GLIBC_2.38 strlcpy F
|
||||
GLIBC_2.4 __confstr_chk F
|
||||
GLIBC_2.4 __fgets_chk F
|
||||
GLIBC_2.4 __fgets_unlocked_chk F
|
||||
|
@ -2574,6 +2574,10 @@ GLIBC_2.38 __isoc23_wcstoull F
|
||||
GLIBC_2.38 __isoc23_wcstoull_l F
|
||||
GLIBC_2.38 __isoc23_wcstoumax F
|
||||
GLIBC_2.38 __isoc23_wscanf F
|
||||
GLIBC_2.38 __strlcat_chk F
|
||||
GLIBC_2.38 __strlcpy_chk F
|
||||
GLIBC_2.38 strlcat F
|
||||
GLIBC_2.38 strlcpy F
|
||||
GLIBC_2.4 __confstr_chk F
|
||||
GLIBC_2.4 __fgets_chk F
|
||||
GLIBC_2.4 __fgets_unlocked_chk F
|
||||
|
@ -2680,3 +2680,7 @@ GLIBC_2.38 __isoc23_wcstoull F
|
||||
GLIBC_2.38 __isoc23_wcstoull_l F
|
||||
GLIBC_2.38 __isoc23_wcstoumax F
|
||||
GLIBC_2.38 __isoc23_wscanf F
|
||||
GLIBC_2.38 __strlcat_chk F
|
||||
GLIBC_2.38 __strlcpy_chk F
|
||||
GLIBC_2.38 strlcat F
|
||||
GLIBC_2.38 strlcpy F
|
||||
|
Loading…
Reference in New Issue
Block a user