Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 50859259 authored by Trond Myklebust's avatar Trond Myklebust
Browse files

SUNRPC: Mask signals across the call to rpc_call_setup() in rpc_run_task



To ensure that the RPCSEC_GSS upcall is performed with the correct sigmask.

Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent 3ff7576d
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -385,6 +385,7 @@ rpcauth_bindcred(struct rpc_task *task)
		.group_info = current->group_info,
	};
	struct rpc_cred *ret;
	sigset_t oldset;
	int flags = 0;

	dprintk("RPC: %5u looking up %s cred\n",
@@ -392,7 +393,9 @@ rpcauth_bindcred(struct rpc_task *task)
	get_group_info(acred.group_info);
	if (task->tk_flags & RPC_TASK_ROOTCREDS)
		flags |= RPCAUTH_LOOKUP_ROOTCREDS;
	rpc_clnt_sigmask(task->tk_client, &oldset);
	ret = auth->au_ops->lookup_cred(auth, &acred, flags);
	rpc_clnt_sigunmask(task->tk_client, &oldset);
	if (!IS_ERR(ret))
		task->tk_msg.rpc_cred = ret;
	else
+7 −6
Original line number Diff line number Diff line
@@ -501,12 +501,12 @@ static void rpc_save_sigmask(sigset_t *oldset, int intr)
	sigprocmask(SIG_BLOCK, &sigmask, oldset);
}

static inline void rpc_task_sigmask(struct rpc_task *task, sigset_t *oldset)
static void rpc_task_sigmask(struct rpc_task *task, sigset_t *oldset)
{
	rpc_save_sigmask(oldset, !RPC_TASK_UNINTERRUPTIBLE(task));
}

static inline void rpc_restore_sigmask(sigset_t *oldset)
static void rpc_restore_sigmask(sigset_t *oldset)
{
	sigprocmask(SIG_SETMASK, oldset, NULL);
}
@@ -536,11 +536,10 @@ struct rpc_task *rpc_run_task(const struct rpc_task_setup *task_setup_data)
	if (task == NULL) {
		rpc_release_calldata(task_setup_data->callback_ops,
				task_setup_data->callback_data);
		return ERR_PTR(-ENOMEM);
		ret = ERR_PTR(-ENOMEM);
		goto out;
	}

	/* Mask signals on synchronous RPC calls and RPCSEC_GSS upcalls */
	rpc_task_sigmask(task, &oldset);
	if (task_setup_data->rpc_message != NULL) {
		rpc_call_setup(task, task_setup_data->rpc_message, 0);
		if (task->tk_status != 0) {
@@ -550,10 +549,12 @@ struct rpc_task *rpc_run_task(const struct rpc_task_setup *task_setup_data)
		}
	}
	atomic_inc(&task->tk_count);
	/* Mask signals on synchronous RPC calls and RPCSEC_GSS upcalls */
	rpc_task_sigmask(task, &oldset);
	rpc_execute(task);
	rpc_restore_sigmask(&oldset);
	ret = task;
out:
	rpc_restore_sigmask(&oldset);
	return ret;
}
EXPORT_SYMBOL_GPL(rpc_run_task);