]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
sunrpc: on successful gss error pipe write, don't return error
authorJeff Layton <jlayton@redhat.com>
Fri, 18 Dec 2009 21:28:20 +0000 (16:28 -0500)
committerGreg Kroah-Hartman <gregkh@suse.de>
Mon, 18 Jan 2010 18:19:21 +0000 (10:19 -0800)
commit 486bad2e40e938cd68fd853b7a9fa3115a9d3a4a upstream.

When handling the gssd downcall, the kernel should distinguish between a
successful downcall that contains an error code and a failed downcall
(i.e. where the parsing failed or some other sort of problem occurred).

In the former case, gss_pipe_downcall should be returning the number of
bytes written to the pipe instead of an error. In the event of other
errors, we generally want the initiating task to retry the upcall so
we set msg.errno to -EAGAIN. An unexpected error code here is a bug
however, so BUG() in that case.

Signed-off-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
net/sunrpc/auth_gss/auth_gss.c

index 129d75ea25d24fbbe5f066dc8a33ceaa4c0dbbbb..9c5a19d9dbcea17569acee79b7c51990270a712a 100644 (file)
@@ -644,7 +644,22 @@ gss_pipe_downcall(struct file *filp, const char __user *src, size_t mlen)
        p = gss_fill_context(p, end, ctx, gss_msg->auth->mech);
        if (IS_ERR(p)) {
                err = PTR_ERR(p);
-               gss_msg->msg.errno = (err == -EAGAIN) ? -EAGAIN : -EACCES;
+               switch (err) {
+               case -EACCES:
+                       gss_msg->msg.errno = err;
+                       err = mlen;
+                       break;
+               case -EFAULT:
+               case -ENOMEM:
+               case -EINVAL:
+               case -ENOSYS:
+                       gss_msg->msg.errno = -EAGAIN;
+                       break;
+               default:
+                       printk(KERN_CRIT "%s: bad return from "
+                               "gss_fill_context: %ld\n", __func__, err);
+                       BUG();
+               }
                goto err_release_msg;
        }
        gss_msg->ctx = gss_get_ctx(ctx);