[Pkg-shadow-devel] Replace strncpy(3) by stpecpy()

Alejandro Colomar (man-pages) alx.manpages at gmail.com
Tue Feb 15 23:01:06 GMT 2022


Hi Serge,

I proposed a few months ago to replace strncpy(3) by strlcpy(3BSD)[1]. 
However, strlcpy(3BSD) is not in glibc, and anyway, it's not ideal: 
strlcat(3BSD) has quadratic time complexity, since it needs to re-read 
the whole string for each copy.

[1]: <https://github.com/shadow-maint/shadow/issues/468>

I designed a function (based on other earlier interfaces, including 
strecopy() and strlcpy(3BSD); see 
<https://software.codidact.com/posts/285946>) that provides a better 
behavior than any other string copy functions, with linear time complexity.

I propose to use it here, implementing it inside shadow-utils.

It is defined as:

char *stpecpy(char *dst, char *restrict src, char *end)
{
	char *p;

	p = memccpy(dst, src, '\0', end + 1 - dst);
	if (p != NULL)
		return p - 1;
	/* truncation detected */
	*end = '\0';
	return end + 1;
}

To be used as:

end = buf + sizeof(buf) - 1;
len = stpecpy(stpecpy(buf, "Hello", end), " world", end) - buf;
if (len == sizeof(buf)) {
	len--;
	handle_trunc();
}


So the 3 main alternatives to strncpy(3) are:

- strlcpy(3BSD) + strlcat(3BSD)
	BSD
	good interface
	bad performance

- memccpy(3)
	ISO C
	good performance
	bad interface

- stpecpy()
	custom
	good performance
	good interface


What are your thoughts?

Regards,

Alex


-- 
Alejandro Colomar
Linux man-pages comaintainer; http://www.kernel.org/doc/man-pages/
http://www.alejandro-colomar.es/



More information about the Pkg-shadow-devel mailing list