opnsense-src/lib/libc
Robert Clausecker 9082398090 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-07-29 21:36:10 +02:00
..
aarch64 Remove residual blank line at start of Makefile 2024-07-15 16:43:39 -06:00
amd64 lib/libc/amd64/string: fix overread condition in memccpy 2024-07-29 21:36:10 +02:00
arm Remove residual blank line at start of Makefile 2024-07-15 16:43:39 -06:00
capability Remove residual blank line at start of Makefile 2024-07-15 16:43:39 -06:00
compat-43 Remove residual blank line at start of Makefile 2024-07-15 16:43:39 -06:00
csu libc: Purge unneeded cdefs.h 2023-11-01 16:44:30 -06:00
db Remove residual blank line at start of Makefile 2024-07-15 16:43:39 -06:00
gdtoa Remove residual blank line at start of Makefile 2024-07-15 16:43:39 -06:00
gen Remove residual blank line at start of Makefile 2024-07-15 16:43:39 -06:00
gmon Remove residual blank line at start of Makefile 2024-07-15 16:43:39 -06:00
i386 Remove residual blank line at start of Makefile 2024-07-15 16:43:39 -06:00
iconv Remove residual blank line at start of Makefile 2024-07-15 16:43:39 -06:00
include libthr: avoid gcc -Wcast-function-type 2024-07-03 08:38:32 -07:00
inet Remove residual blank line at start of Makefile 2024-07-15 16:43:39 -06:00
isc Remove residual blank line at start of Makefile 2024-07-15 16:43:39 -06:00
locale Remove residual blank line at start of Makefile 2024-07-15 16:43:39 -06:00
md Remove residual blank line at start of Makefile 2024-07-15 16:43:39 -06:00
nameser Remove residual blank line at start of Makefile 2024-07-15 16:43:39 -06:00
net libc/getnameinfo: stop adding NI_NUMERICHOST where inappropriate 2024-07-26 11:03:56 +00:00
nls libc: Remove empty comments in Symbol.map 2023-11-15 17:51:03 +00:00
posix1e Remove residual blank line at start of Makefile 2024-07-15 16:43:39 -06:00
powerpc Remove residual blank line at start of Makefile 2024-07-15 16:43:39 -06:00
powerpc64 Remove residual blank line at start of Makefile 2024-07-15 16:43:39 -06:00
powerpcspe Remove residual blank line at start of Makefile 2024-07-15 16:43:39 -06:00
quad Remove residual blank line at start of Makefile 2024-07-15 16:43:39 -06:00
regex Remove residual blank line at start of Makefile 2024-07-15 16:43:39 -06:00
resolv Remove residual blank line at start of Makefile 2024-07-15 16:43:39 -06:00
riscv Remove residual blank line at start of Makefile 2024-07-15 16:43:39 -06:00
rpc Remove residual blank line at start of Makefile 2024-07-15 16:43:39 -06:00
secure include: ssp: don't shadow the mempcpy builtin 2024-07-16 00:12:28 -05:00
softfloat libc/softfloat: we don't export _fp[gs]et* symbols 2024-03-13 20:35:41 +00:00
stdio Remove residual blank line at start of Makefile 2024-07-15 16:43:39 -06:00
stdlib Remove residual blank line at start of Makefile 2024-07-15 16:43:39 -06:00
stdtime libc: Improve description of mktime() / timegm(). 2024-03-27 11:03:37 +01:00
string include: ssp: don't shadow the mempcpy builtin 2024-07-16 00:12:28 -05:00
sys libc: switch to __weak_symbol for fortified interpose stubs 2024-07-16 00:12:28 -05:00
tests Remove residual blank line at start of Makefile 2024-07-15 16:43:39 -06:00
uuid Remove residual blank line at start of Makefile 2024-07-15 16:43:39 -06:00
x86/gen Remove residual blank line at start of Makefile 2024-07-15 16:43:39 -06:00
xdr Remove residual blank line at start of Makefile 2024-07-15 16:43:39 -06:00
yp Remove residual blank line at start of Makefile 2024-07-15 16:43:39 -06: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 Remove residual blank line at start of Makefile 2024-07-15 16:43:39 -06:00
Makefile.depend dirdeps: Update/fix Makefile.depend* for toolchain 2023-11-26 20:50:13 -05: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 2023-09-22 10:16:29 +02:00