opnsense-src/lib/libc
Robert Clausecker 644d814471 lib/libc/amd64/string: fix overread condition in memccpy
An overread condition in memccpy(dst, src, c, len) would occur if
src does not cross a 16 byte boundary and there is no instance of
c between *src and the next 16 byte boundary.  This could cause a
read fault if src is just before the end of a page and the next page
is unmapped or unreadable.

The bug is a consequence of basing memccpy() on the strlcpy() code:
whereas strlcpy() assumes that src is a nul-terminated string and
hence a terminator is always present, c may not be present at all in
the source string.  It was not caught earlier due to insufficient
unit test design.

As a part of the fix, the function is refactored such that the runt
case (buffer length from last alignment boundary between 1 and 32 B)
is handled separately.  This reduces the number of conditional
branches on all code paths and simplifies the handling of early
matches in the non-runt case.  Performance is improved slightly.

os: FreeBSD
arch: amd64
cpu: 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz
        │ memccpy.unfixed.out │        memccpy.fixed.out           │
        │       sec/op        │   sec/op     vs base               │
Short             66.76µ ± 0%   62.45µ ± 1%  -6.44% (p=0.000 n=20)
Mid               7.938µ ± 0%   7.967µ ± 0%  +0.36% (p=0.001 n=20)
Long              3.577µ ± 0%   3.577µ ± 0%       ~ (p=0.429 n=20)
geomean           12.38µ        12.12µ       -2.08%

        │ memccpy.unfixed.out │         memccpy.fixed.out           │
        │         B/s         │     B/s       vs base               │
Short            1.744Gi ± 0%   1.864Gi ± 1%  +6.89% (p=0.000 n=20)
Mid              14.67Gi ± 0%   14.61Gi ± 0%  -0.36% (p=0.001 n=20)
Long             32.55Gi ± 0%   32.55Gi ± 0%       ~ (p=0.429 n=20)
geomean          9.407Gi        9.606Gi       +2.12%

Reported by:	getz
Reviewed by:	getz
Approved by:	mjg (blanket, via IRC)
See also:	D46051
MFC:		stable/14
Event:		GSoC 2024
Differential Revision:	https://reviews.freebsd.org/D46052
2024-08-07 16:18:40 +02:00
..
aarch64 libc: Teach libc about the BTI elf note 2024-02-19 13:17:37 +00:00
amd64 lib/libc/amd64/string: fix overread condition in memccpy 2024-08-07 16:18:40 +02:00
arm libc: rename arm and i386 Ovfork.S to vfork.S 2024-01-02 16:58:42 +00:00
capability capsicum: introduce cap_rights_is_empty Function 2024-06-05 11:55:17 -04:00
compat-43 libc: Remove empty comments in Symbol.map 2023-12-13 22:08:13 +00:00
csu libc: Purge unneeded cdefs.h 2023-11-26 21:20:09 -07:00
db libc: Remove empty comments in Symbol.map 2023-12-13 22:08:13 +00:00
gdtoa libc: Remove empty comments in Symbol.map 2023-12-13 22:08:13 +00:00
gen dlopen(3): mention fdlopen for capsicum(4) 2024-05-13 10:22:34 -04:00
gmon libc: Remove empty comments in Symbol.map 2023-12-13 22:08:13 +00:00
i386 libc: rename arm and i386 Ovfork.S to vfork.S 2024-01-02 16:58:42 +00:00
iconv libc: Remove empty comments in Symbol.map 2023-12-13 22:08:13 +00:00
include libc_private.h: use private namespace name for size_t 2024-04-30 04:14:52 +03:00
inet libc: Remove empty comments in Symbol.map 2023-12-13 22:08:13 +00:00
isc libc: Purge unneeded cdefs.h 2023-11-26 21:20:09 -07:00
locale libc: remove some obsolete VCS data 2023-12-13 23:08:50 +00:00
md Remove $FreeBSD$: one-line sh pattern 2023-08-16 11:55:03 -06:00
nameser libc: Remove empty comments in Symbol.map 2023-12-13 22:08:13 +00:00
net sctp: document sctp_recvmsg as implemented 2024-08-04 00:19:33 +02:00
nls libc: Remove empty comments in Symbol.map 2023-12-13 22:08:13 +00:00
posix1e libc: correct some memory leaks in acl_to_text(3) and acl_to_text_np(3) 2023-12-20 10:29:55 +02:00
powerpc libc: centralize a few numeric symbols 2023-12-13 22:08:14 +00:00
powerpc64 libc: centralize a few numeric symbols 2023-12-13 22:08:14 +00:00
powerpcspe libc/<arch>/sys/Makefile.inc: remove cruft 2023-12-13 22:08:13 +00:00
quad libc: Remove empty comments in Symbol.map 2023-12-13 22:08:13 +00:00
regex libc: Remove empty comments in Symbol.map 2023-12-13 22:08:13 +00:00
resolv libc: Remove empty comments in Symbol.map 2023-12-13 22:08:13 +00:00
riscv libc: don't needlessly add vfork.o to NOASM 2024-01-02 16:58:54 +00:00
rpc libc: move NIS xdr_* symbols from rpc's to yp's Symbol.map 2024-05-29 11:40:18 -04:00
secure libc: Remove empty comments in Symbol.map 2023-12-13 22:08:13 +00:00
softfloat libc: Remove empty comments in Symbol.map 2023-12-13 22:08:13 +00:00
stdio libc printf_render_errno(): do not use strerror() 2024-04-30 03:48:10 +03:00
stdlib __cxa_thread_call_dtors(3): fix dtor pointer validity check 2024-05-10 10:49:10 +03:00
stdtime libc: Improve description of mktime() / timegm(). 2024-04-04 11:41:41 +02:00
string libc: make strerror_rl() usable for libc 2024-04-30 03:48:10 +03:00
sys access(2): Discourage use of these system calls. 2024-05-23 04:41:32 +02:00
tests libc/tests: Further refine the condition for installing h_raw 2024-07-14 12:16:32 -04:00
uuid libc: Remove empty comments in Symbol.map 2023-12-13 22:08:13 +00:00
x86 pkru.3: Fix a typo in the manual page 2024-01-23 07:43:42 +01:00
xdr xdr(3): Fix a few typos in source code comments 2024-03-26 06:55:55 +01:00
yp libc: move NIS xdr_* symbols from rpc's to yp's Symbol.map 2024-05-29 11:40:18 -04:00
libc.ldscript Remove $FreeBSD$: one-line .c comment pattern 2023-08-16 11:54:29 -06:00
libc_nossp.ldscript Remove $FreeBSD$: one-line .c comment pattern 2023-08-16 11:54:29 -06:00
Makefile lib{c,lzma,z}: remove -DSYMBOL_VERSIONING from CFLAGS 2023-12-13 22:08:13 +00:00
Makefile.depend Remove $FreeBSD$: one-line sh pattern 2023-08-16 11:55:03 -06:00
Makefile.depend.options Remove $FreeBSD$: one-line sh pattern 2023-08-16 11:55:03 -06:00
Versions.def Create namespace for the symbols added during 15-CURRENT cycle 2024-01-31 01:14:38 -06:00