aboutsummaryrefslogtreecommitdiffstats
path: root/net/sunrpc
diff options
context:
space:
mode:
authorAndy Adamson <andros@citi.umich.edu>2006-01-18 20:43:24 -0500
committerLinus Torvalds <torvalds@g5.osdl.org>2006-01-18 22:20:25 -0500
commit822f1005ae1f3a4a8b136f38a6933d3f719f4c4a (patch)
tree34265fcf1cd957c7b34101b2152b4e5cc9c45086 /net/sunrpc
parentfd44527707f2697fd2959e8bdb321ae588d150e2 (diff)
[PATCH] svcrpc: gss: handle the GSS_S_CONTINUE
Kerberos context initiation is handled in a single round trip, but other mechanisms (including spkm3) may require more, so we need to handle the GSS_S_CONTINUE case in svcauth_gss_accept. Send a null verifier. Signed-off-by: Andy Adamson <andros@citi.umich.edu> 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>
Diffstat (limited to 'net/sunrpc')
-rw-r--r--net/sunrpc/auth_gss/svcauth_gss.c30
1 files changed, 25 insertions, 5 deletions
diff --git a/net/sunrpc/auth_gss/svcauth_gss.c b/net/sunrpc/auth_gss/svcauth_gss.c
index e4ada15ed856..d2ccc7e8faab 100644
--- a/net/sunrpc/auth_gss/svcauth_gss.c
+++ b/net/sunrpc/auth_gss/svcauth_gss.c
@@ -586,6 +586,20 @@ gss_verify_header(struct svc_rqst *rqstp, struct rsc *rsci,
586} 586}
587 587
588static int 588static int
589gss_write_null_verf(struct svc_rqst *rqstp)
590{
591 u32 *p;
592
593 svc_putu32(rqstp->rq_res.head, htonl(RPC_AUTH_NULL));
594 p = rqstp->rq_res.head->iov_base + rqstp->rq_res.head->iov_len;
595 /* don't really need to check if head->iov_len > PAGE_SIZE ... */
596 *p++ = 0;
597 if (!xdr_ressize_check(rqstp, p))
598 return -1;
599 return 0;
600}
601
602static int
589gss_write_verf(struct svc_rqst *rqstp, struct gss_ctx *ctx_id, u32 seq) 603gss_write_verf(struct svc_rqst *rqstp, struct gss_ctx *ctx_id, u32 seq)
590{ 604{
591 u32 xdr_seq; 605 u32 xdr_seq;
@@ -876,12 +890,18 @@ svcauth_gss_accept(struct svc_rqst *rqstp, u32 *authp)
876 case -ENOENT: 890 case -ENOENT:
877 goto drop; 891 goto drop;
878 case 0: 892 case 0:
879 rsci = gss_svc_searchbyctx(&rsip->out_handle); 893 if (rsip->major_status == GSS_S_COMPLETE) {
880 if (!rsci) { 894 rsci = gss_svc_searchbyctx(&rsip->out_handle);
881 goto drop; 895 if (!rsci) {
896 goto drop;
897 }
898 if (gss_write_verf(rqstp, rsci->mechctx,
899 GSS_SEQ_WIN))
900 goto drop;
901 } else {
902 if (gss_write_null_verf(rqstp))
903 goto drop;
882 } 904 }
883 if (gss_write_verf(rqstp, rsci->mechctx, GSS_SEQ_WIN))
884 goto drop;
885 if (resv->iov_len + 4 > PAGE_SIZE) 905 if (resv->iov_len + 4 > PAGE_SIZE)
886 goto drop; 906 goto drop;
887 svc_putu32(resv, rpc_success); 907 svc_putu32(resv, rpc_success);