tech-kern archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: Usage of strncpy in the kernel
On Sat, Jan 04, 2025 at 01:47:02PM +0100, Roland Illig wrote:
> > On 2025-01-04 11:14, David Holland wrote:
> >> maybe something like
> >>
> >> strlcpy_tofixed(char *dest, size_t destlen, const char *src);
> >> strlcpy_fromfixed(char *dest, size_t destmax, const char *src, size_t srclen);
> >>
> >> and
> >>
> >> strlcpy_zerofill(char *dest, const char *src, size_t destmax);
>
> I like these proposals, as their names clearly communicate their
> purpose, and when looking at the code during an audit, I can quickly see
> that the copying takes place correctly, by looking at only a single
> function call. The functions should not be called "strlcpy" though, as
> that implies that they perform a strlen(src).
?
I used the "l" because like strlcpy they (should) check all the
lengths and won't overrun.
> Simply calling them "strcpy" should suffice. The size_t parameters
> should all be called "size" instead of "len" or "max".
There's a distinction there (length of a fixed-sized field vs. max
size of a buffer) that shouldn't be discarded. It's a cue to the
consumer of the interface; not necessarily a strong one but any little
bit can sometimes be that hint that makes you go "wait a sec".
"len" vs. "size" is endlessly debatable, especially for char, but I
tend to favor "length" for strings (and "num" or maybe "count" for
arrays) because it's clearer about what the units are.
FWIW, the general problem with size is as follows:
void foo(long *ptr, unsigned size);
Is that size in size_t units (that is, bytes) or longs? Either of
these is unambiguous and should therefore be preferred:
void foo(long *ptr, unsigned num);
void foo(long *ptr, unsigned bytes);
Similarly if you have void bar (wchar_t *ptr, unsigned size) it could
reasonably be interpreted as either bytes or wchars, while "len" is
unambiguous.
--
David A. Holland
dholland%netbsd.org@localhost
Home |
Main Index |
Thread Index |
Old Index