mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-09 04:10:18 +09:00
sunrpc: on successful gss error pipe write, don't return error
commit 486bad2e40 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>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
8ffe94786b
commit
8064af147b
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user