From 6c62e7e401f3221efb2159c2539f3dce1cf95096 Mon Sep 17 00:00:00 2001 From: auronandace Date: Mon, 15 Dec 2025 07:58:44 +0000 Subject: [PATCH] fix strlcpy and strlcat --- src/header/string/mod.rs | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/src/header/string/mod.rs b/src/header/string/mod.rs index 8726ed201f..e5dcfd7708 100644 --- a/src/header/string/mod.rs +++ b/src/header/string/mod.rs @@ -381,11 +381,11 @@ pub unsafe extern "C" fn strerror_r(errnum: c_int, buf: *mut c_char, buflen: siz /// See . #[unsafe(no_mangle)] -pub unsafe extern "C" fn strlcat(dst: *mut c_char, src: *const c_char, n: size_t) -> size_t { - let len = strlen(dst) as isize; - let d = dst.offset(len); - - strlcpy(d, src, n) +pub unsafe extern "C" fn strlcat(dst: *mut c_char, src: *const c_char, dstsize: size_t) -> size_t { + let dst_len = unsafe { strlen(dst) }; + let d = unsafe { dst.offset(dst_len as isize) }; + let src_len = unsafe { strlcpy(d, src, dstsize) }; + src_len + if dst_len > dstsize { dstsize } else { dst_len } } #[unsafe(no_mangle)] @@ -407,15 +407,25 @@ pub unsafe extern "C" fn strsep(str_: *mut *mut c_char, sep: *const c_char) -> * /// See . #[unsafe(no_mangle)] -pub unsafe extern "C" fn strlcpy(dst: *mut c_char, src: *const c_char, n: size_t) -> size_t { +pub unsafe extern "C" fn strlcpy(dst: *mut c_char, src: *const c_char, dstsize: size_t) -> size_t { let mut i = 0; - while *src.add(i) != 0 && i < n { - *dst.add(i) = *src.add(i); + while unsafe { *src.add(i) } != 0 && i < dstsize { + unsafe { + *dst.add(i) = *src.add(i); + } i += 1; } - *dst.add(i) = 0; + if dstsize != 0 { + unsafe { + *dst.add(i) = 0; + } + } + + while unsafe { *src.add(i) } != 0 { + i += 1; + } i as size_t }