Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

SUNRPC refactor rpcauth_checkverf error returns

Most of the time an error from the credops crvalidate function means the
server has sent us a garbage verifier. The gss_validate function is the
exception where there is an -EACCES case if the user GSS_context on the client
has expired.

Signed-off-by: Andy Adamson <andros@netapp.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>

authored by

Andy Adamson and committed by
Trond Myklebust
35fa5f7b dc24826b

+19 -13
+5 -2
net/sunrpc/auth_gss/auth_gss.c
··· 1501 1501 struct xdr_netobj mic; 1502 1502 u32 flav,len; 1503 1503 u32 maj_stat; 1504 + __be32 *ret = ERR_PTR(-EIO); 1504 1505 1505 1506 dprintk("RPC: %5u %s\n", task->tk_pid, __func__); 1506 1507 ··· 1517 1516 mic.data = (u8 *)p; 1518 1517 mic.len = len; 1519 1518 1519 + ret = ERR_PTR(-EACCES); 1520 1520 maj_stat = gss_verify_mic(ctx->gc_gss_ctx, &verf_buf, &mic); 1521 1521 if (maj_stat == GSS_S_CONTEXT_EXPIRED) 1522 1522 clear_bit(RPCAUTH_CRED_UPTODATE, &cred->cr_flags); ··· 1535 1533 return p + XDR_QUADLEN(len); 1536 1534 out_bad: 1537 1535 gss_put_ctx(ctx); 1538 - dprintk("RPC: %5u %s failed.\n", task->tk_pid, __func__); 1539 - return NULL; 1536 + dprintk("RPC: %5u %s failed ret %ld.\n", task->tk_pid, __func__, 1537 + PTR_ERR(ret)); 1538 + return ret; 1540 1539 } 1541 1540 1542 1541 static void gss_wrap_req_encode(kxdreproc_t encode, struct rpc_rqst *rqstp,
+2 -2
net/sunrpc/auth_null.c
··· 88 88 flavor = ntohl(*p++); 89 89 if (flavor != RPC_AUTH_NULL) { 90 90 printk("RPC: bad verf flavor: %u\n", flavor); 91 - return NULL; 91 + return ERR_PTR(-EIO); 92 92 } 93 93 94 94 size = ntohl(*p++); 95 95 if (size != 0) { 96 96 printk("RPC: bad verf size: %u\n", size); 97 - return NULL; 97 + return ERR_PTR(-EIO); 98 98 } 99 99 100 100 return p;
+2 -2
net/sunrpc/auth_unix.c
··· 192 192 flavor != RPC_AUTH_UNIX && 193 193 flavor != RPC_AUTH_SHORT) { 194 194 printk("RPC: bad verf flavor: %u\n", flavor); 195 - return NULL; 195 + return ERR_PTR(-EIO); 196 196 } 197 197 198 198 size = ntohl(*p++); 199 199 if (size > RPC_MAX_AUTH_SIZE) { 200 200 printk("RPC: giant verf size: %u\n", size); 201 - return NULL; 201 + return ERR_PTR(-EIO); 202 202 } 203 203 task->tk_rqstp->rq_cred->cr_auth->au_rslack = (size >> 2) + 2; 204 204 p += (size >> 2);
+10 -7
net/sunrpc/clnt.c
··· 2072 2072 dprintk("RPC: %5u %s: XDR representation not a multiple of" 2073 2073 " 4 bytes: 0x%x\n", task->tk_pid, __func__, 2074 2074 task->tk_rqstp->rq_rcv_buf.len); 2075 - goto out_eio; 2075 + error = -EIO; 2076 + goto out_err; 2076 2077 } 2077 2078 if ((len -= 3) < 0) 2078 2079 goto out_overflow; ··· 2082 2081 if ((n = ntohl(*p++)) != RPC_REPLY) { 2083 2082 dprintk("RPC: %5u %s: not an RPC reply: %x\n", 2084 2083 task->tk_pid, __func__, n); 2084 + error = -EIO; 2085 2085 goto out_garbage; 2086 2086 } 2087 2087 ··· 2101 2099 dprintk("RPC: %5u %s: RPC call rejected, " 2102 2100 "unknown error: %x\n", 2103 2101 task->tk_pid, __func__, n); 2104 - goto out_eio; 2102 + error = -EIO; 2103 + goto out_err; 2105 2104 } 2106 2105 if (--len < 0) 2107 2106 goto out_overflow; ··· 2147 2144 task->tk_pid, __func__, n); 2148 2145 goto out_err; 2149 2146 } 2150 - if (!(p = rpcauth_checkverf(task, p))) { 2151 - dprintk("RPC: %5u %s: auth check failed\n", 2152 - task->tk_pid, __func__); 2147 + p = rpcauth_checkverf(task, p); 2148 + if (IS_ERR(p)) { 2149 + error = PTR_ERR(p); 2150 + dprintk("RPC: %5u %s: auth check failed with %d\n", 2151 + task->tk_pid, __func__, error); 2153 2152 goto out_garbage; /* bad verifier, retry */ 2154 2153 } 2155 2154 len = p - (__be32 *)iov->iov_base - 1; ··· 2204 2199 out_retry: 2205 2200 return ERR_PTR(-EAGAIN); 2206 2201 } 2207 - out_eio: 2208 - error = -EIO; 2209 2202 out_err: 2210 2203 rpc_exit(task, error); 2211 2204 dprintk("RPC: %5u %s: call failed with error %d\n", task->tk_pid,