lkml.org 
[lkml]   [2023]   [Aug]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: [PATCH v3] kobject: Replace strlcpy with strscpy
    On Wed, Aug 30, 2023 at 08:20:21PM +0000, Azeem Shaikh wrote:
    > strlcpy() reads the entire source buffer first.
    > This read may exceed the destination size limit.
    > This is both inefficient and can lead to linear read
    > overflows if a source string is not NUL-terminated [1].
    > In an effort to remove strlcpy() completely [2], replace
    > strlcpy() here with strscpy().
    >
    > Direct replacement is safe here since return value of -errno
    > is used to check for truncation instead of sizeof(dest).
    >
    > [1] https://www.kernel.org/doc/html/latest/process/deprecated.html#strlcpy
    > [2] https://github.com/KSPP/linux/issues/89
    >
    > Signed-off-by: Azeem Shaikh <azeemshaikh38@gmail.com>
    > ---
    > v3:
    > * Fixed weird indentation.
    >
    > v2:
    > * Updated error message to remove @len which is errno now.
    > * https://lore.kernel.org/all/20230830150136.3798414-1-azeemshaikh38@gmail.com/
    >
    > v1:
    > * https://lore.kernel.org/all/20230703180528.3709258-1-azeemshaikh38@gmail.com/
    >
    > lib/kobject_uevent.c | 8 ++++----
    > 1 file changed, 4 insertions(+), 4 deletions(-)
    >
    > diff --git a/lib/kobject_uevent.c b/lib/kobject_uevent.c
    > index 7c44b7ae4c5c..032d81b959f0 100644
    > --- a/lib/kobject_uevent.c
    > +++ b/lib/kobject_uevent.c
    > @@ -254,10 +254,10 @@ static int init_uevent_argv(struct kobj_uevent_env *env, const char *subsystem)
    > int buffer_size = sizeof(env->buf) - env->buflen;
    > int len;
    >
    > - len = strlcpy(&env->buf[env->buflen], subsystem, buffer_size);
    > - if (len >= buffer_size) {
    > - pr_warn("init_uevent_argv: buffer size of %d too small, needed %d\n",
    > - buffer_size, len);
    > + len = strscpy(&env->buf[env->buflen], subsystem, buffer_size);
    > + if (len < 0) {
    > + pr_warn("init_uevent_argv: insufficient buffer space "
    > + "(%u left) for %s\n", buffer_size, subsystem);
    > return -ENOMEM;
    > }

    I thought scripts/checkpatch.pl would warn about this, but kernel
    coding-style (as it is) says to not split strings. I'd expect this to
    be:

    + pr_warn("init_uevent_argv: insufficient buffer space (%u left) for %s\n",
    + buffer_size, subsystem);


    --
    Kees Cook

    \
     
     \ /
      Last update: 2023-08-31 00:35    [W:4.733 / U:0.900 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site