Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging-2.6
[cascardo/linux.git] / net / sunrpc / auth_gss / auth_gss.c
index f7a7f83..0cfccc2 100644 (file)
@@ -206,8 +206,14 @@ gss_fill_context(const void *p, const void *end, struct gss_cl_ctx *ctx, struct
        ctx->gc_win = window_size;
        /* gssd signals an error by passing ctx->gc_win = 0: */
        if (ctx->gc_win == 0) {
-               /* in which case, p points to  an error code which we ignore */
-               p = ERR_PTR(-EACCES);
+               /*
+                * in which case, p points to an error code. Anything other
+                * than -EKEYEXPIRED gets converted to -EACCES.
+                */
+               p = simple_get_bytes(p, end, &ret, sizeof(ret));
+               if (!IS_ERR(p))
+                       p = (ret == -EKEYEXPIRED) ? ERR_PTR(-EKEYEXPIRED) :
+                                                   ERR_PTR(-EACCES);
                goto err;
        }
        /* copy the opaque wire context */
@@ -646,6 +652,7 @@ gss_pipe_downcall(struct file *filp, const char __user *src, size_t mlen)
                err = PTR_ERR(p);
                switch (err) {
                case -EACCES:
+               case -EKEYEXPIRED:
                        gss_msg->msg.errno = err;
                        err = mlen;
                        break;