diff --git a/src/header/string/mod.rs b/src/header/string/mod.rs index 320f3bbebc5c26f829d2e7b2dd39ef97cf887501..ffedf79d67aa485a5dc6958e6aa002c2f01b1a4a 100644 --- a/src/header/string/mod.rs +++ b/src/header/string/mod.rs @@ -461,3 +461,25 @@ pub unsafe extern "C" fn strxfrm(s1: *mut c_char, s2: *const c_char, n: size_t) } len } + +#[no_mangle] +pub unsafe extern "C" fn strlcpy(dst: *mut c_char, src: *const c_char, n: size_t) -> size_t { + let mut i = 0; + + while *src.add(i) != 0 && i < n { + *dst.add(i) = *src.add(i); + i += 1; + } + + *dst.add(i) = 0; + + i as size_t +} + +#[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 mut d = dst.offset(len); + + strlcpy(d, src, n) +} diff --git a/tests/expected/bins_static/string/strcpy.stdout b/tests/expected/bins_static/string/strcpy.stdout index 84caf120d631da5d3ad544722fa9360c41029fc2..0152da433f4e79607b249c2519eb7b4e3ac86eae 100644 --- a/tests/expected/bins_static/string/strcpy.stdout +++ b/tests/expected/bins_static/string/strcpy.stdout @@ -1,3 +1,7 @@ strcpy works! strncpy works! strncpy shaaaaaaaaa +strlcpy works! +copied 14 +strlcpy works! and strlcat! +copied 13 diff --git a/tests/string/strcpy.c b/tests/string/strcpy.c index d78d26e51b9c96f4568891c6da6c0ef69ba94cdb..25b02763178b10e8584f86b5e6f5e2b01f993f76 100644 --- a/tests/string/strcpy.c +++ b/tests/string/strcpy.c @@ -16,4 +16,14 @@ int main(void) { dst[19] = 0; strncpy(dst, "strncpy should work here too", 10); puts(dst); + + // The string should be properly terminated regardless + char ndst[28]; + + size_t r = strlcpy(ndst, "strlcpy works!", 28); + puts(ndst); + printf("copied %lu\n", r); + r = strlcat(ndst, " and strlcat!", 28); + puts(ndst); + printf("copied %lu\n", r); }