NFS: Fix infinite loop in gss_create_upcall()
Subsystems (3)
PATCH 2/6 NFS: Fix infinite loop in gss_create_upcall()
There can be an infinite loop if gss_create_upcall() is called without the userspace program running. To prevent this, we return -EACCES if we notice that pipe_version hasn't changed (indicating that the pipe has not been opened).
Signed-off-by Bryan Schumaker <[email protected]>
--- fs/nfs/nfs4proc.c | 5 +++-- net/sunrpc/auth_gss/auth_gss.c | 8 +++++--- 2 files changed, 8 insertions(+), 5 deletions(-)
fs/nfs/nfs4proc.c +3 -2
@@ -2224,8 +2224,9 @@ static int nfs4_proc_get_root(struct nfs_server *server, struct nfs_fh *fhandle,for (i =0 ; i < len; i++) { status =nfs4_lookup_root_sec (server, fhandle, info, flav_array[i]); -if (status != -EPERM ) -break ; +if (status == -EPERM || status == -EACCES ) +continue ; +break ; }if (status ==0 ) status =nfs4_server_capabilities (server, fhandle);
net/sunrpc/auth_gss/auth_gss.c +5 -3
@@ -520,7 +520,7 @@ gss_refresh_upcall(struct rpc_task *task)warn_gssd (); task->tk_timeout =15 *HZ ;rpc_sleep_on (&pipe_version_rpc_waitqueue, task,NULL ); -return 0 ; +return -EAGAIN ; }if (IS_ERR (gss_msg)) { err =PTR_ERR (gss_msg);
@@ -563,10 +563,12 @@ retry:if (PTR_ERR (gss_msg) == -EAGAIN ) { err =wait_event_interruptible_timeout (pipe_version_waitqueue, pipe_version >=0 ,15 *HZ ); +if (pipe_version <0 ) { +warn_gssd (); + err = -EACCES ; + }if (err) goto out; -if (pipe_version <0 ) -warn_gssd (); goto retry; }if (IS_ERR (gss_msg)) {
Signature · 1 line
1.7.4.4