syzbot can trigger the WARN() in init_uevent_argv() which isn't the
nicest as the code does properly recover and handle the error.  So
change the WARN() call to pr_warn() and provide some more information on
what the buffer size that was needed.

Link: https://lore.kernel.org/r/[email protected]
Reported-by: [email protected]
Cc: "Rafael J. Wysocki" <[email protected]>
Cc: [email protected]
Signed-off-by: Greg Kroah-Hartman <[email protected]>
---
 lib/kobject_uevent.c | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/lib/kobject_uevent.c b/lib/kobject_uevent.c
index 7998affa45d4..c87d5b6a8a55 100644
--- a/lib/kobject_uevent.c
+++ b/lib/kobject_uevent.c
@@ -251,12 +251,13 @@ static int kobj_usermode_filter(struct kobject *kobj)
 
 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,
-                     sizeof(env->buf) - env->buflen);
-       if (len >= (sizeof(env->buf) - env->buflen)) {
-               WARN(1, KERN_ERR "init_uevent_argv: buffer size too small\n");
+       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);
                return -ENOMEM;
        }
 
-- 
2.31.1

Reply via email to