From 4ed695003570a53eaf9b9c0e1850b4bb7a9d52b9 Mon Sep 17 00:00:00 2001 From: Ashish Pratap Singh Bhadoria Date: Tue, 27 Sep 2022 20:21:05 +0530 Subject: [PATCH] smcinvoke: Avoid marshalling user args if Callback invocation fails. Avoid marshalling user args in kernel driver if the corresponding CallBack invocation fails in userspace. Change-Id: I1dc5ca562c5a67e1ac2273a1ff2a854f2010c1d3 --- smcinvoke/smcinvoke.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/smcinvoke/smcinvoke.c b/smcinvoke/smcinvoke.c index 9005b3cdb1..0196ad1b57 100644 --- a/smcinvoke/smcinvoke.c +++ b/smcinvoke/smcinvoke.c @@ -2000,6 +2000,12 @@ static int marshal_out_tzcb_req(const struct smcinvoke_accept *user_req, release_tzhandles(&cb_txn->cb_req->hdr.tzhandle, 1); tzcb_req->result = user_req->result; + /* Return without marshaling user args if destination callback invocation was + unsuccessful. */ + if (tzcb_req->result != 0) { + ret = 0; + goto out; + } FOR_ARGS(i, tzcb_req->hdr.counts, BO) { union smcinvoke_arg tmp_arg; @@ -2038,12 +2044,12 @@ static int marshal_out_tzcb_req(const struct smcinvoke_accept *user_req, trace_marshal_out_tzcb_req(i, tmp_arg.o.fd, tmp_arg.o.cb_server_fd, tz_args[i].handle); } - FOR_ARGS(i, tzcb_req->hdr.counts, OI) { - if (TZHANDLE_IS_CB_OBJ(tz_args[i].handle)) - release_tzhandles(&tz_args[i].handle, 1); - } ret = 0; out: + FOR_ARGS(i, tzcb_req->hdr.counts, OI) { + if (TZHANDLE_IS_CB_OBJ(tz_args[i].handle)) + release_tzhandles(&tz_args[i].handle, 1); + } if (ret) release_tzhandles(tzhandles_to_release, OBJECT_COUNTS_MAX_OO); return ret;