Hi Kees, On Mon, Feb 5, 2024 at 1:37 PM Kees Cook <keesc...@chromium.org> wrote: > Using sizeof(dst) for the "size" argument in strscpy() is the > overwhelmingly common case. Instead of requiring this everywhere, allow a > 2-argument version to be used that will use the sizeof() internally. There > are other functions in the kernel with optional arguments[1], so this > isn't unprecedented, and improves readability. Update and relocate the > kern-doc for strscpy() too. > > Adjust ARCH=um build to notice the changed export name, as it doesn't > do full header includes for the string helpers. > > This could additionally let us save a few hundred lines of code: > 1177 files changed, 2455 insertions(+), 3026 deletions(-) > with a treewide cleanup using Coccinelle: > > @needless_arg@ > expression DST, SRC; > @@ > > strscpy(DST, SRC > -, sizeof(DST) > ) > > Link: https://elixir.bootlin.com/linux/v6.7/source/include/linux/pci.h#L1517 > [1] > Reviewed-by: Justin Stitt <justinst...@google.com> > Cc: Andy Shevchenko <a...@kernel.org> > Cc: linux-hardening@vger.kernel.org > Signed-off-by: Kees Cook <keesc...@chromium.org>
Thanks for your patch! > --- a/include/linux/string.h > +++ b/include/linux/string.h > +/* > + * The 2 argument style can only be used when dst is an array with a > + * known size. > + */ > +#define __strscpy0(dst, src, ...) \ > + sized_strscpy(dst, src, sizeof(dst) + __must_be_array(dst)) > +#define __strscpy1(dst, src, size) sized_strscpy(dst, src, size) (dst), (src), (size) etc. > + > +/** > + * strscpy - Copy a C-string into a sized buffer > + * @dst: Where to copy the string to > + * @src: Where to copy the string from > + * @...: Size of destination buffer (optional) > + * > + * Copy the source string @src, or as much of it as fits, into the > + * destination @dst buffer. The behavior is undefined if the string > + * buffers overlap. The destination @dst buffer is always NUL terminated, > + * unless it's zero-sized. > + * > + * The size argument @... is only required when @dst is not an array, or > + * when the copy needs to be smaller than sizeof(@dst). > + * > + * Preferred to strncpy() since it always returns a valid string, and > + * doesn't unnecessarily force the tail of the destination buffer to be > + * zero padded. If padding is desired please use strscpy_pad(). > + * > + * Returns the number of characters copied in @dst (not including the > + * trailing %NUL) or -E2BIG if @size is 0 or the copy from @src was > + * truncated. > + */ > +#define strscpy(dst, src, ...) \ > + CONCATENATE(__strscpy, COUNT_ARGS(__VA_ARGS__))(dst, src, __VA_ARGS__) Likewise Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- ge...@linux-m68k.org In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds