Message ID | 20240205123525.1379299-3-keescook@chromium.org (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | string: Allow 2-argument strscpy() | expand |
Hi Kees, On Mon, Feb 5, 2024 at 1:36 PM Kees Cook <keescook@chromium.org> wrote: > Similar to strscpy(), update strscpy_pad()'s 3rd argument to be > optional when the destination is a compile-time known size array. > > Cc: Andy Shevchenko <andy@kernel.org> > Cc: linux-hardening@vger.kernel.org > Signed-off-by: Kees Cook <keescook@chromium.org> Thanks for your patch! > --- a/include/linux/string.h > +++ b/include/linux/string.h > @@ -78,6 +78,10 @@ ssize_t sized_strscpy(char *, const char *, size_t); > sized_strscpy(dst, src, sizeof(dst) + __must_be_array(dst)) > #define __strscpy1(dst, src, size) sized_strscpy(dst, src, size) > > +#define __strscpy_pad0(dst, src, ...) \ > + sized_strscpy_pad(dst, src, sizeof(dst) + __must_be_array(dst)) > +#define __strscpy_pad1(dst, src, size) sized_strscpy_pad(dst, src, size) (dst) etc. > @@ -123,17 +139,8 @@ ssize_t sized_strscpy(char *, const char *, size_t); > * * The number of characters copied (not including the trailing %NULs) > * * -E2BIG if count is 0 or @src was truncated. > */ > -#define strscpy_pad(dest, src, count) ({ \ > - char *__dst = (dest); \ > - const char *__src = (src); \ > - const size_t __count = (count); \ > - ssize_t __wrote; \ > - \ > - __wrote = strscpy(__dst, __src, __count); \ > - if (__wrote >= 0 && __wrote < __count) \ > - memset(__dst + __wrote + 1, 0, __count - __wrote - 1); \ > - __wrote; \ > -}) > +#define strscpy_pad(dst, src, ...) \ > + CONCATENATE(__strscpy_pad, COUNT_ARGS(__VA_ARGS__))(dst, src, __VA_ARGS__) Likewise, Gr{oetje,eeting}s, Geert
On Mon, Feb 05, 2024 at 01:48:51PM +0100, Geert Uytterhoeven wrote: > On Mon, Feb 5, 2024 at 1:36 PM Kees Cook <keescook@chromium.org> wrote: ... > > +#define __strscpy_pad1(dst, src, size) sized_strscpy_pad(dst, src, size) > > (dst) etc. Makes a little sense here. Are you expecting, e.g., dst to be 'a, b' (w/o quotes where a and b are expressions)? ... > > +#define strscpy_pad(dst, src, ...) \ > > + CONCATENATE(__strscpy_pad, COUNT_ARGS(__VA_ARGS__))(dst, src, __VA_ARGS__) > > Likewise, Ditto.
diff --git a/include/linux/string.h b/include/linux/string.h index a21371aa2fd6..4f0f27013418 100644 --- a/include/linux/string.h +++ b/include/linux/string.h @@ -78,6 +78,10 @@ ssize_t sized_strscpy(char *, const char *, size_t); sized_strscpy(dst, src, sizeof(dst) + __must_be_array(dst)) #define __strscpy1(dst, src, size) sized_strscpy(dst, src, size) +#define __strscpy_pad0(dst, src, ...) \ + sized_strscpy_pad(dst, src, sizeof(dst) + __must_be_array(dst)) +#define __strscpy_pad1(dst, src, size) sized_strscpy_pad(dst, src, size) + /** * strscpy - Copy a C-string into a sized buffer * @dst: Where to copy the string to @@ -103,6 +107,18 @@ ssize_t sized_strscpy(char *, const char *, size_t); #define strscpy(dst, src, ...) \ CONCATENATE(__strscpy, COUNT_ARGS(__VA_ARGS__))(dst, src, __VA_ARGS__) +#define sized_strscpy_pad(dest, src, count) ({ \ + char *__dst = (dest); \ + const char *__src = (src); \ + const size_t __count = (count); \ + ssize_t __wrote; \ + \ + __wrote = sized_strscpy(__dst, __src, __count); \ + if (__wrote >= 0 && __wrote < __count) \ + memset(__dst + __wrote + 1, 0, __count - __wrote - 1); \ + __wrote; \ +}) + /** * strscpy_pad() - Copy a C-string into a sized buffer * @dest: Where to copy the string to @@ -123,17 +139,8 @@ ssize_t sized_strscpy(char *, const char *, size_t); * * The number of characters copied (not including the trailing %NULs) * * -E2BIG if count is 0 or @src was truncated. */ -#define strscpy_pad(dest, src, count) ({ \ - char *__dst = (dest); \ - const char *__src = (src); \ - const size_t __count = (count); \ - ssize_t __wrote; \ - \ - __wrote = strscpy(__dst, __src, __count); \ - if (__wrote >= 0 && __wrote < __count) \ - memset(__dst + __wrote + 1, 0, __count - __wrote - 1); \ - __wrote; \ -}) +#define strscpy_pad(dst, src, ...) \ + CONCATENATE(__strscpy_pad, COUNT_ARGS(__VA_ARGS__))(dst, src, __VA_ARGS__) #ifndef __HAVE_ARCH_STRCAT extern char * strcat(char *, const char *);
Similar to strscpy(), update strscpy_pad()'s 3rd argument to be optional when the destination is a compile-time known size array. Cc: Andy Shevchenko <andy@kernel.org> Cc: linux-hardening@vger.kernel.org Signed-off-by: Kees Cook <keescook@chromium.org> --- include/linux/string.h | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-)