[PATCH] svcrpc: gss: server context init failure handling
authorKevin Coffman <kwc@citi.umich.edu>
Thu, 19 Jan 2006 01:43:25 +0000 (17:43 -0800)
committerLinus Torvalds <torvalds@g5.osdl.org>
Thu, 19 Jan 2006 03:20:25 +0000 (19:20 -0800)
We require the server's gssd to create a completed context before asking the
kernel to send a final context init reply.  However, gssd could be buggy, or
under some bizarre circumstances we might purge the context from our cache
before we get the chance to use it here.

Handle this case by returning GSS_S_NO_CONTEXT to the client.

Also move the relevant code here to a separate function rather than nesting
excessively.

Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
Signed-off-by: Neil Brown <neilb@suse.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
net/sunrpc/auth_gss/svcauth_gss.c

index d2ccc7e8faabe822766a00731c057b55da9d01d8..fdad66dc9a9fc3eaba25d07930c4cd72953af0ea 100644 (file)
@@ -755,6 +755,21 @@ svcauth_gss_set_client(struct svc_rqst *rqstp)
        return SVC_OK;
 }
 
+static inline int
+gss_write_init_verf(struct svc_rqst *rqstp, struct rsi *rsip)
+{
+       struct rsc *rsci;
+
+       if (rsip->major_status != GSS_S_COMPLETE)
+               return gss_write_null_verf(rqstp);
+       rsci = gss_svc_searchbyctx(&rsip->out_handle);
+       if (rsci == NULL) {
+               rsip->major_status = GSS_S_NO_CONTEXT;
+               return gss_write_null_verf(rqstp);
+       }
+       return gss_write_verf(rqstp, rsci->mechctx, GSS_SEQ_WIN);
+}
+
 /*
  * Accept an rpcsec packet.
  * If context establishment, punt to user space
@@ -890,18 +905,8 @@ svcauth_gss_accept(struct svc_rqst *rqstp, u32 *authp)
                case -ENOENT:
                        goto drop;
                case 0:
-                       if (rsip->major_status == GSS_S_COMPLETE) {
-                               rsci = gss_svc_searchbyctx(&rsip->out_handle);
-                               if (!rsci) {
-                                       goto drop;
-                               }
-                               if (gss_write_verf(rqstp, rsci->mechctx,
-                                                       GSS_SEQ_WIN))
-                                       goto drop;
-                       } else {
-                               if (gss_write_null_verf(rqstp))
-                                       goto drop;
-                       }
+                       if (gss_write_init_verf(rqstp, rsip))
+                               goto drop;
                        if (resv->iov_len + 4 > PAGE_SIZE)
                                goto drop;
                        svc_putu32(resv, rpc_success);