Commit 25cf32ad authored by Trond Myklebust's avatar Trond Myklebust
Browse files

SUNRPC: Handle allocation failure in rpc_new_task()



If the call to rpc_alloc_task() fails, then ensure that the calldata is
released, and that rpc_run_task() and rpc_run_bc_task() bail out early.

Reported-by: default avatarNeilBrown <neilb@suse.de>
Fixes: 910ad386 ("NFS: Fix memory allocation in rpc_alloc_task()")
Signed-off-by: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
parent 88dee0cc
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -1127,6 +1127,8 @@ struct rpc_task *rpc_run_task(const struct rpc_task_setup *task_setup_data)
	struct rpc_task *task;

	task = rpc_new_task(task_setup_data);
	if (IS_ERR(task))
		return task;

	if (!RPC_IS_ASYNC(task))
		task->tk_flags |= RPC_TASK_CRED_NOREF;
@@ -1227,6 +1229,11 @@ struct rpc_task *rpc_run_bc_task(struct rpc_rqst *req)
	 * Create an rpc_task to send the data
	 */
	task = rpc_new_task(&task_setup_data);
	if (IS_ERR(task)) {
		xprt_free_bc_request(req);
		return task;
	}

	xprt_init_bc_request(req, task);

	task->tk_action = call_bc_encode;
+5 −0
Original line number Diff line number Diff line
@@ -1128,6 +1128,11 @@ struct rpc_task *rpc_new_task(const struct rpc_task_setup *setup_data)

	if (task == NULL) {
		task = rpc_alloc_task();
		if (task == NULL) {
			rpc_release_calldata(setup_data->callback_ops,
					     setup_data->callback_data);
			return ERR_PTR(-ENOMEM);
		}
		flags = RPC_TASK_DYNAMIC;
	}