Commit 0562b572 authored by Pasha Tatashin's avatar Pasha Tatashin Committed by Andrew Morton
Browse files

liveupdate: fix return value on session allocation failure

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: default avatarPasha Tatashin <pasha.tatashin@soleen.com>
Reviewed-by: default avatarPratyush 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: default avatarAndrew Morton <akpm@linux-foundation.org>
parent 60265506
Loading
Loading
Loading
Loading
+10 −5
Original line number Diff line number Diff line
@@ -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)