diff options
Diffstat (limited to 'net/sunrpc/auth_gss/auth_gss.c')
| -rw-r--r-- | net/sunrpc/auth_gss/auth_gss.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/net/sunrpc/auth_gss/auth_gss.c b/net/sunrpc/auth_gss/auth_gss.c index f7a7f8380e38..c389ccf6437d 100644 --- a/net/sunrpc/auth_gss/auth_gss.c +++ b/net/sunrpc/auth_gss/auth_gss.c | |||
| @@ -206,8 +206,14 @@ gss_fill_context(const void *p, const void *end, struct gss_cl_ctx *ctx, struct | |||
| 206 | ctx->gc_win = window_size; | 206 | ctx->gc_win = window_size; |
| 207 | /* gssd signals an error by passing ctx->gc_win = 0: */ | 207 | /* gssd signals an error by passing ctx->gc_win = 0: */ |
| 208 | if (ctx->gc_win == 0) { | 208 | if (ctx->gc_win == 0) { |
| 209 | /* in which case, p points to an error code which we ignore */ | 209 | /* |
| 210 | p = ERR_PTR(-EACCES); | 210 | * in which case, p points to an error code. Anything other |
| 211 | * than -EKEYEXPIRED gets converted to -EACCES. | ||
| 212 | */ | ||
| 213 | p = simple_get_bytes(p, end, &ret, sizeof(ret)); | ||
| 214 | if (!IS_ERR(p)) | ||
| 215 | p = (ret == -EKEYEXPIRED) ? ERR_PTR(-EKEYEXPIRED) : | ||
| 216 | ERR_PTR(-EACCES); | ||
| 211 | goto err; | 217 | goto err; |
| 212 | } | 218 | } |
| 213 | /* copy the opaque wire context */ | 219 | /* copy the opaque wire context */ |
| @@ -646,6 +652,7 @@ gss_pipe_downcall(struct file *filp, const char __user *src, size_t mlen) | |||
| 646 | err = PTR_ERR(p); | 652 | err = PTR_ERR(p); |
| 647 | switch (err) { | 653 | switch (err) { |
| 648 | case -EACCES: | 654 | case -EACCES: |
| 655 | case -EKEYEXPIRED: | ||
| 649 | gss_msg->msg.errno = err; | 656 | gss_msg->msg.errno = err; |
| 650 | err = mlen; | 657 | err = mlen; |
| 651 | break; | 658 | break; |
| @@ -1273,9 +1280,8 @@ alloc_enc_pages(struct rpc_rqst *rqstp) | |||
| 1273 | rqstp->rq_release_snd_buf = priv_release_snd_buf; | 1280 | rqstp->rq_release_snd_buf = priv_release_snd_buf; |
| 1274 | return 0; | 1281 | return 0; |
| 1275 | out_free: | 1282 | out_free: |
| 1276 | for (i--; i >= 0; i--) { | 1283 | rqstp->rq_enc_pages_num = i; |
| 1277 | __free_page(rqstp->rq_enc_pages[i]); | 1284 | priv_release_snd_buf(rqstp); |
| 1278 | } | ||
| 1279 | out: | 1285 | out: |
| 1280 | return -EAGAIN; | 1286 | return -EAGAIN; |
| 1281 | } | 1287 | } |
