]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
liveupdate: fix return value on session allocation failure
authorPasha Tatashin <pasha.tatashin@soleen.com>
Wed, 15 Apr 2026 19:37:38 +0000 (19:37 +0000)
committerAndrew Morton <akpm@linux-foundation.org>
Mon, 27 Apr 2026 12:54:23 +0000 (05:54 -0700)
When session allocation fails during deserialization, the global 'err'
variable was not updated before returning.  This caused subsequent calls
to luo_session_deserialize() to incorrectly report success.

Ensure 'err' is set to the error code from PTR_ERR(session).  This ensures
that an error is correctly returned to userspace when it attempts to open
/dev/liveupdate in the new kernel if deserialization failed.

Link: https://lore.kernel.org/20260415193738.515491-1-pasha.tatashin@soleen.com
Signed-off-by: Pasha Tatashin <pasha.tatashin@soleen.com>
Reviewed-by: Pratyush Yadav (Google) <pratyush@kernel.org>
Cc: David Matlack <dmatlack@google.com>
Cc: Mike Rapoport <rppt@kernel.org>
Cc: Samiullah Khawaja <skhawaja@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
kernel/liveupdate/luo_session.c

index a3327a28fc1f72909fa7dff93daf47cb298e31ae..7a42385dabe27989c6904cbbd6fa5ee6ac9ed82e 100644 (file)
@@ -514,11 +514,12 @@ int luo_session_deserialize(void)
 {
        struct luo_session_header *sh = &luo_session_global.incoming;
        static bool is_deserialized;
-       static int err;
+       static int saved_err;
+       int err;
 
        /* If has been deserialized, always return the same error code */
        if (is_deserialized)
-               return err;
+               return saved_err;
 
        is_deserialized = true;
        if (!sh->active)
@@ -547,7 +548,8 @@ int luo_session_deserialize(void)
                        pr_warn("Failed to allocate session [%.*s] during deserialization %pe\n",
                                (int)sizeof(sh->ser[i].name),
                                sh->ser[i].name, session);
-                       return PTR_ERR(session);
+                       err = PTR_ERR(session);
+                       goto save_err;
                }
 
                err = luo_session_insert(sh, session);
@@ -555,7 +557,7 @@ int luo_session_deserialize(void)
                        pr_warn("Failed to insert session [%s] %pe\n",
                                session->name, ERR_PTR(err));
                        luo_session_free(session);
-                       return err;
+                       goto save_err;
                }
 
                scoped_guard(mutex, &session->mutex) {
@@ -565,7 +567,7 @@ int luo_session_deserialize(void)
                if (err) {
                        pr_warn("Failed to deserialize files for session [%s] %pe\n",
                                session->name, ERR_PTR(err));
-                       return err;
+                       goto save_err;
                }
        }
 
@@ -574,6 +576,9 @@ int luo_session_deserialize(void)
        sh->ser = NULL;
 
        return 0;
+save_err:
+       saved_err = err;
+       return err;
 }
 
 int luo_session_serialize(void)