aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTrond Myklebust <Trond.Myklebust@netapp.com>2007-10-25 18:19:37 -0400
committerTrond Myklebust <Trond.Myklebust@netapp.com>2008-01-30 02:05:31 -0500
commit5085925902cc4d93b9a4992936edd2aee70a5e15 (patch)
tree4d938ccdf4a32ef9c66d005d96dacb4cfb744216
parent3ff7576ddac06c3d07089e241b40826d24bbf1ac (diff)
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: Trond Myklebust <Trond.Myklebust@netapp.com>
-rw-r--r--net/sunrpc/auth.c3
-rw-r--r--net/sunrpc/clnt.c13
2 files changed, 10 insertions, 6 deletions
diff --git a/net/sunrpc/auth.c b/net/sunrpc/auth.c
index eca941ce298b..bcd9abdb031c 100644
--- a/net/sunrpc/auth.c
+++ b/net/sunrpc/auth.c
@@ -385,6 +385,7 @@ rpcauth_bindcred(struct rpc_task *task)
385 .group_info = current->group_info, 385 .group_info = current->group_info,
386 }; 386 };
387 struct rpc_cred *ret; 387 struct rpc_cred *ret;
388 sigset_t oldset;
388 int flags = 0; 389 int flags = 0;
389 390
390 dprintk("RPC: %5u looking up %s cred\n", 391 dprintk("RPC: %5u looking up %s cred\n",
@@ -392,7 +393,9 @@ rpcauth_bindcred(struct rpc_task *task)
392 get_group_info(acred.group_info); 393 get_group_info(acred.group_info);
393 if (task->tk_flags & RPC_TASK_ROOTCREDS) 394 if (task->tk_flags & RPC_TASK_ROOTCREDS)
394 flags |= RPCAUTH_LOOKUP_ROOTCREDS; 395 flags |= RPCAUTH_LOOKUP_ROOTCREDS;
396 rpc_clnt_sigmask(task->tk_client, &oldset);
395 ret = auth->au_ops->lookup_cred(auth, &acred, flags); 397 ret = auth->au_ops->lookup_cred(auth, &acred, flags);
398 rpc_clnt_sigunmask(task->tk_client, &oldset);
396 if (!IS_ERR(ret)) 399 if (!IS_ERR(ret))
397 task->tk_msg.rpc_cred = ret; 400 task->tk_msg.rpc_cred = ret;
398 else 401 else
diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c
index 9aad45946d32..aefe3ae218f7 100644
--- a/net/sunrpc/clnt.c
+++ b/net/sunrpc/clnt.c
@@ -501,12 +501,12 @@ static void rpc_save_sigmask(sigset_t *oldset, int intr)
501 sigprocmask(SIG_BLOCK, &sigmask, oldset); 501 sigprocmask(SIG_BLOCK, &sigmask, oldset);
502} 502}
503 503
504static inline void rpc_task_sigmask(struct rpc_task *task, sigset_t *oldset) 504static void rpc_task_sigmask(struct rpc_task *task, sigset_t *oldset)
505{ 505{
506 rpc_save_sigmask(oldset, !RPC_TASK_UNINTERRUPTIBLE(task)); 506 rpc_save_sigmask(oldset, !RPC_TASK_UNINTERRUPTIBLE(task));
507} 507}
508 508
509static inline void rpc_restore_sigmask(sigset_t *oldset) 509static void rpc_restore_sigmask(sigset_t *oldset)
510{ 510{
511 sigprocmask(SIG_SETMASK, oldset, NULL); 511 sigprocmask(SIG_SETMASK, oldset, NULL);
512} 512}
@@ -536,11 +536,10 @@ struct rpc_task *rpc_run_task(const struct rpc_task_setup *task_setup_data)
536 if (task == NULL) { 536 if (task == NULL) {
537 rpc_release_calldata(task_setup_data->callback_ops, 537 rpc_release_calldata(task_setup_data->callback_ops,
538 task_setup_data->callback_data); 538 task_setup_data->callback_data);
539 return ERR_PTR(-ENOMEM); 539 ret = ERR_PTR(-ENOMEM);
540 goto out;
540 } 541 }
541 542
542 /* Mask signals on synchronous RPC calls and RPCSEC_GSS upcalls */
543 rpc_task_sigmask(task, &oldset);
544 if (task_setup_data->rpc_message != NULL) { 543 if (task_setup_data->rpc_message != NULL) {
545 rpc_call_setup(task, task_setup_data->rpc_message, 0); 544 rpc_call_setup(task, task_setup_data->rpc_message, 0);
546 if (task->tk_status != 0) { 545 if (task->tk_status != 0) {
@@ -550,10 +549,12 @@ struct rpc_task *rpc_run_task(const struct rpc_task_setup *task_setup_data)
550 } 549 }
551 } 550 }
552 atomic_inc(&task->tk_count); 551 atomic_inc(&task->tk_count);
552 /* Mask signals on synchronous RPC calls and RPCSEC_GSS upcalls */
553 rpc_task_sigmask(task, &oldset);
553 rpc_execute(task); 554 rpc_execute(task);
555 rpc_restore_sigmask(&oldset);
554 ret = task; 556 ret = task;
555out: 557out:
556 rpc_restore_sigmask(&oldset);
557 return ret; 558 return ret;
558} 559}
559EXPORT_SYMBOL_GPL(rpc_run_task); 560EXPORT_SYMBOL_GPL(rpc_run_task);