diff mbox

[Version,4,5/5] SUNRPC refactor rpcauth_checkverf error returns

Message ID 1374176130-11657-6-git-send-email-andros@netapp.com (mailing list archive)
State New, archived
Headers show

Commit Message

Andy Adamson July 18, 2013, 7:35 p.m. UTC
From: Andy Adamson <andros@netapp.com>

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>
---
 net/sunrpc/auth_gss/auth_gss.c |  7 +++++--
 net/sunrpc/auth_null.c         |  5 +++--
 net/sunrpc/auth_unix.c         |  5 +++--
 net/sunrpc/clnt.c              | 17 ++++++++++-------
 4 files changed, 21 insertions(+), 13 deletions(-)

Comments

Trond Myklebust Aug. 7, 2013, 7:07 p.m. UTC | #1
T24gVGh1LCAyMDEzLTA3LTE4IGF0IDE1OjM1IC0wNDAwLCBhbmRyb3NAbmV0YXBwLmNvbSB3cm90
ZToNCj4gRnJvbTogQW5keSBBZGFtc29uIDxhbmRyb3NAbmV0YXBwLmNvbT4NCj4gDQo+IE1vc3Qg
b2YgdGhlIHRpbWUgYW4gZXJyb3IgZnJvbSB0aGUgY3JlZG9wcyBjcnZhbGlkYXRlIGZ1bmN0aW9u
IG1lYW5zIHRoZQ0KPiBzZXJ2ZXIgaGFzIHNlbnQgdXMgYSBnYXJiYWdlIHZlcmlmaWVyLiBUaGUg
Z3NzX3ZhbGlkYXRlIGZ1bmN0aW9uIGlzIHRoZQ0KPiBleGNlcHRpb24gd2hlcmUgdGhlcmUgaXMg
YW4gLUVBQ0NFUyBjYXNlIGlmIHRoZSB1c2VyIEdTU19jb250ZXh0IG9uIHRoZSBjbGllbnQNCj4g
aGFzIGV4cGlyZWQuDQo+IA0KPiBTaWduZWQtb2ZmLWJ5OiBBbmR5IEFkYW1zb24gPGFuZHJvc0Bu
ZXRhcHAuY29tPg0KPiAtLS0NCj4gIG5ldC9zdW5ycGMvYXV0aF9nc3MvYXV0aF9nc3MuYyB8ICA3
ICsrKysrLS0NCj4gIG5ldC9zdW5ycGMvYXV0aF9udWxsLmMgICAgICAgICB8ICA1ICsrKy0tDQo+
ICBuZXQvc3VucnBjL2F1dGhfdW5peC5jICAgICAgICAgfCAgNSArKystLQ0KPiAgbmV0L3N1bnJw
Yy9jbG50LmMgICAgICAgICAgICAgIHwgMTcgKysrKysrKysrKy0tLS0tLS0NCj4gIDQgZmlsZXMg
Y2hhbmdlZCwgMjEgaW5zZXJ0aW9ucygrKSwgMTMgZGVsZXRpb25zKC0pDQo+IA0KPiBkaWZmIC0t
Z2l0IGEvbmV0L3N1bnJwYy9hdXRoX2dzcy9hdXRoX2dzcy5jIGIvbmV0L3N1bnJwYy9hdXRoX2dz
cy9hdXRoX2dzcy5jDQo+IGluZGV4IGUxZjQ3MzUuLmQwNTAwYmMgMTAwNjQ0DQo+IC0tLSBhL25l
dC9zdW5ycGMvYXV0aF9nc3MvYXV0aF9nc3MuYw0KPiArKysgYi9uZXQvc3VucnBjL2F1dGhfZ3Nz
L2F1dGhfZ3NzLmMNCj4gQEAgLTEzMzQsNiArMTMzNCw3IEBAIGdzc192YWxpZGF0ZShzdHJ1Y3Qg
cnBjX3Rhc2sgKnRhc2ssIF9fYmUzMiAqcCkNCj4gIAlzdHJ1Y3QgeGRyX25ldG9iaiBtaWM7DQo+
ICAJdTMyCQlmbGF2LGxlbjsNCj4gIAl1MzIJCW1hal9zdGF0Ow0KPiArCV9fYmUzMgkJKnJldCA9
IEVSUl9QVFIoLUVJTyk7DQo+ICANCj4gIAlkcHJpbnRrKCJSUEM6ICU1dSAlc1xuIiwgdGFzay0+
dGtfcGlkLCBfX2Z1bmNfXyk7DQo+ICANCj4gQEAgLTEzNDksNiArMTM1MCw3IEBAIGdzc192YWxp
ZGF0ZShzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2ssIF9fYmUzMiAqcCkNCj4gIAltaWMuZGF0YSA9ICh1
OCAqKXA7DQo+ICAJbWljLmxlbiA9IGxlbjsNCj4gIA0KPiArCXJldCA9IEVSUl9QVFIoLUVBQ0NF
Uyk7DQo+ICAJbWFqX3N0YXQgPSBnc3NfdmVyaWZ5X21pYyhjdHgtPmdjX2dzc19jdHgsICZ2ZXJm
X2J1ZiwgJm1pYyk7DQo+ICAJaWYgKG1hal9zdGF0ID09IEdTU19TX0NPTlRFWFRfRVhQSVJFRCkN
Cj4gIAkJY2xlYXJfYml0KFJQQ0FVVEhfQ1JFRF9VUFRPREFURSwgJmNyZWQtPmNyX2ZsYWdzKTsN
Cj4gQEAgLTEzNjYsOCArMTM2OCw5IEBAIGdzc192YWxpZGF0ZShzdHJ1Y3QgcnBjX3Rhc2sgKnRh
c2ssIF9fYmUzMiAqcCkNCj4gIAlyZXR1cm4gcCArIFhEUl9RVUFETEVOKGxlbik7DQo+ICBvdXRf
YmFkOg0KPiAgCWdzc19wdXRfY3R4KGN0eCk7DQo+IC0JZHByaW50aygiUlBDOiAlNXUgJXMgZmFp
bGVkLlxuIiwgdGFzay0+dGtfcGlkLCBfX2Z1bmNfXyk7DQo+IC0JcmV0dXJuIE5VTEw7DQo+ICsJ
ZHByaW50aygiUlBDOiAlNXUgJXMgZmFpbGVkIHJldCAlbGQuXG4iLCB0YXNrLT50a19waWQsIF9f
ZnVuY19fLA0KPiArCQlQVFJfRVJSKHJldCkpOw0KPiArCXJldHVybiByZXQ7DQo+ICB9DQo+ICAN
Cj4gIHN0YXRpYyB2b2lkIGdzc193cmFwX3JlcV9lbmNvZGUoa3hkcmVwcm9jX3QgZW5jb2RlLCBz
dHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLA0KPiBkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9hdXRoX251
bGwuYyBiL25ldC9zdW5ycGMvYXV0aF9udWxsLmMNCj4gaW5kZXggYTVjMzZjMC4uZDYwYTY3MyAx
MDA2NDQNCj4gLS0tIGEvbmV0L3N1bnJwYy9hdXRoX251bGwuYw0KPiArKysgYi9uZXQvc3VucnBj
L2F1dGhfbnVsbC5jDQo+IEBAIC04NCwxNyArODQsMTggQEAgbnVsX3ZhbGlkYXRlKHN0cnVjdCBy
cGNfdGFzayAqdGFzaywgX19iZTMyICpwKQ0KPiAgew0KPiAgCXJwY19hdXRoZmxhdm9yX3QJZmxh
dm9yOw0KPiAgCXUzMgkJCXNpemU7DQo+ICsJX19iZTMyCQkJKnJldCA9IEVSUl9QVFIoLUVJTyk7
DQo+ICANCj4gIAlmbGF2b3IgPSBudG9obCgqcCsrKTsNCj4gIAlpZiAoZmxhdm9yICE9IFJQQ19B
VVRIX05VTEwpIHsNCj4gIAkJcHJpbnRrKCJSUEM6IGJhZCB2ZXJmIGZsYXZvcjogJXVcbiIsIGZs
YXZvcik7DQo+IC0JCXJldHVybiBOVUxMOw0KPiArCQlyZXR1cm4gcmV0Ow0KDQpXaHkgbm90IGp1
c3QgcmV0dXJuIEVSUl9QVFIoLUVJTyk/IEl0IGRvZXNuJ3QgbG9vayBhcyBpZiAncmV0JyBjYW4g
ZXZlcg0KdGFrZSBhbnkgZGlmZmVyZW50IHZhbHVlcy4gRGl0dG8gYmVsb3cuDQoNCj4gIAl9DQo+
ICANCj4gIAlzaXplID0gbnRvaGwoKnArKyk7DQo+ICAJaWYgKHNpemUgIT0gMCkgew0KPiAgCQlw
cmludGsoIlJQQzogYmFkIHZlcmYgc2l6ZTogJXVcbiIsIHNpemUpOw0KPiAtCQlyZXR1cm4gTlVM
TDsNCj4gKwkJcmV0dXJuIHJldDsNCj4gIAl9DQo+ICANCj4gIAlyZXR1cm4gcDsNCj4gZGlmZiAt
LWdpdCBhL25ldC9zdW5ycGMvYXV0aF91bml4LmMgYi9uZXQvc3VucnBjL2F1dGhfdW5peC5jDQo+
IGluZGV4IGRjMzcwMjEuLjQ2MWE0NDQgMTAwNjQ0DQo+IC0tLSBhL25ldC9zdW5ycGMvYXV0aF91
bml4LmMNCj4gKysrIGIvbmV0L3N1bnJwYy9hdXRoX3VuaXguYw0KPiBAQCAtMTg2LDE5ICsxODYs
MjAgQEAgdW54X3ZhbGlkYXRlKHN0cnVjdCBycGNfdGFzayAqdGFzaywgX19iZTMyICpwKQ0KPiAg
ew0KPiAgCXJwY19hdXRoZmxhdm9yX3QJZmxhdm9yOw0KPiAgCXUzMgkJCXNpemU7DQo+ICsJX19i
ZTMyCQkJKnJldCA9IEVSUl9QVFIoLUVJTyk7DQo+ICANCj4gIAlmbGF2b3IgPSBudG9obCgqcCsr
KTsNCj4gIAlpZiAoZmxhdm9yICE9IFJQQ19BVVRIX05VTEwgJiYNCj4gIAkgICAgZmxhdm9yICE9
IFJQQ19BVVRIX1VOSVggJiYNCj4gIAkgICAgZmxhdm9yICE9IFJQQ19BVVRIX1NIT1JUKSB7DQo+
ICAJCXByaW50aygiUlBDOiBiYWQgdmVyZiBmbGF2b3I6ICV1XG4iLCBmbGF2b3IpOw0KPiAtCQly
ZXR1cm4gTlVMTDsNCj4gKwkJcmV0dXJuIHJldDsNCj4gIAl9DQo+ICANCj4gIAlzaXplID0gbnRv
aGwoKnArKyk7DQo+ICAJaWYgKHNpemUgPiBSUENfTUFYX0FVVEhfU0laRSkgew0KPiAgCQlwcmlu
dGsoIlJQQzogZ2lhbnQgdmVyZiBzaXplOiAldVxuIiwgc2l6ZSk7DQo+IC0JCXJldHVybiBOVUxM
Ow0KPiArCQlyZXR1cm4gcmV0Ow0KPiAgCX0NCj4gIAl0YXNrLT50a19ycXN0cC0+cnFfY3JlZC0+
Y3JfYXV0aC0+YXVfcnNsYWNrID0gKHNpemUgPj4gMikgKyAyOw0KPiAgCXAgKz0gKHNpemUgPj4g
Mik7DQo+IGRpZmYgLS1naXQgYS9uZXQvc3VucnBjL2NsbnQuYyBiL25ldC9zdW5ycGMvY2xudC5j
DQo+IGluZGV4IDY4ZTg1OTUuLjVlZmM4OWMgMTAwNjQ0DQo+IC0tLSBhL25ldC9zdW5ycGMvY2xu
dC5jDQo+ICsrKyBiL25ldC9zdW5ycGMvY2xudC5jDQo+IEBAIC0yMDkwLDcgKzIwOTAsOCBAQCBy
cGNfdmVyaWZ5X2hlYWRlcihzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2spDQo+ICAJCWRwcmludGsoIlJQ
QzogJTV1ICVzOiBYRFIgcmVwcmVzZW50YXRpb24gbm90IGEgbXVsdGlwbGUgb2YiDQo+ICAJCSAg
ICAgICAiIDQgYnl0ZXM6IDB4JXhcbiIsIHRhc2stPnRrX3BpZCwgX19mdW5jX18sDQo+ICAJCSAg
ICAgICB0YXNrLT50a19ycXN0cC0+cnFfcmN2X2J1Zi5sZW4pOw0KPiAtCQlnb3RvIG91dF9laW87
DQo+ICsJCWVycm9yID0gLUVJTzsNCj4gKwkJZ290byBvdXRfZXJyOw0KPiAgCX0NCj4gIAlpZiAo
KGxlbiAtPSAzKSA8IDApDQo+ICAJCWdvdG8gb3V0X292ZXJmbG93Ow0KPiBAQCAtMjA5OSw2ICsy
MTAwLDcgQEAgcnBjX3ZlcmlmeV9oZWFkZXIoc3RydWN0IHJwY190YXNrICp0YXNrKQ0KPiAgCWlm
ICgobiA9IG50b2hsKCpwKyspKSAhPSBSUENfUkVQTFkpIHsNCj4gIAkJZHByaW50aygiUlBDOiAl
NXUgJXM6IG5vdCBhbiBSUEMgcmVwbHk6ICV4XG4iLA0KPiAgCQkJdGFzay0+dGtfcGlkLCBfX2Z1
bmNfXywgbik7DQo+ICsJCWVycm9yID0gLUVJTzsNCj4gIAkJZ290byBvdXRfZ2FyYmFnZTsNCj4g
IAl9DQo+ICANCj4gQEAgLTIxMTcsNyArMjExOSw4IEBAIHJwY192ZXJpZnlfaGVhZGVyKHN0cnVj
dCBycGNfdGFzayAqdGFzaykNCj4gIAkJCWRwcmludGsoIlJQQzogJTV1ICVzOiBSUEMgY2FsbCBy
ZWplY3RlZCwgIg0KPiAgCQkJCSJ1bmtub3duIGVycm9yOiAleFxuIiwNCj4gIAkJCQl0YXNrLT50
a19waWQsIF9fZnVuY19fLCBuKTsNCj4gLQkJCWdvdG8gb3V0X2VpbzsNCj4gKwkJCWVycm9yID0g
LUVJTzsNCj4gKwkJCWdvdG8gb3V0X2VycjsNCj4gIAkJfQ0KPiAgCQlpZiAoLS1sZW4gPCAwKQ0K
PiAgCQkJZ290byBvdXRfb3ZlcmZsb3c7DQo+IEBAIC0yMTYyLDkgKzIxNjUsMTEgQEAgcnBjX3Zl
cmlmeV9oZWFkZXIoc3RydWN0IHJwY190YXNrICp0YXNrKQ0KPiAgCQkJCXRhc2stPnRrX3BpZCwg
X19mdW5jX18sIG4pOw0KPiAgCQlnb3RvIG91dF9lcnI7DQo+ICAJfQ0KPiAtCWlmICghKHAgPSBy
cGNhdXRoX2NoZWNrdmVyZih0YXNrLCBwKSkpIHsNCj4gLQkJZHByaW50aygiUlBDOiAlNXUgJXM6
IGF1dGggY2hlY2sgZmFpbGVkXG4iLA0KPiAtCQkJCXRhc2stPnRrX3BpZCwgX19mdW5jX18pOw0K
PiArCXAgPSBycGNhdXRoX2NoZWNrdmVyZih0YXNrLCBwKTsNCj4gKwlpZiAoSVNfRVJSKHApKSB7
DQo+ICsJCWVycm9yID0gUFRSX0VSUihwKTsNCj4gKwkJZHByaW50aygiUlBDOiAlNXUgJXM6IGF1
dGggY2hlY2sgZmFpbGVkIHdpdGggJWRcbiIsDQo+ICsJCQkJdGFzay0+dGtfcGlkLCBfX2Z1bmNf
XywgZXJyb3IpOw0KPiAgCQlnb3RvIG91dF9nYXJiYWdlOwkJLyogYmFkIHZlcmlmaWVyLCByZXRy
eSAqLw0KPiAgCX0NCj4gIAlsZW4gPSBwIC0gKF9fYmUzMiAqKWlvdi0+aW92X2Jhc2UgLSAxOw0K
PiBAQCAtMjIxNyw4ICsyMjIyLDYgQEAgb3V0X2dhcmJhZ2U6DQo+ICBvdXRfcmV0cnk6DQo+ICAJ
CXJldHVybiBFUlJfUFRSKC1FQUdBSU4pOw0KPiAgCX0NCj4gLW91dF9laW86DQo+IC0JZXJyb3Ig
PSAtRUlPOw0KPiAgb3V0X2VycjoNCj4gIAlycGNfZXhpdCh0YXNrLCBlcnJvcik7DQo+ICAJZHBy
aW50aygiUlBDOiAlNXUgJXM6IGNhbGwgZmFpbGVkIHdpdGggZXJyb3IgJWRcbiIsIHRhc2stPnRr
X3BpZCwNCg0KLS0gDQpUcm9uZCBNeWtsZWJ1c3QNCkxpbnV4IE5GUyBjbGllbnQgbWFpbnRhaW5l
cg0KDQpOZXRBcHANClRyb25kLk15a2xlYnVzdEBuZXRhcHAuY29tDQp3d3cubmV0YXBwLmNvbQ0K
--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/net/sunrpc/auth_gss/auth_gss.c b/net/sunrpc/auth_gss/auth_gss.c
index e1f4735..d0500bc 100644
--- a/net/sunrpc/auth_gss/auth_gss.c
+++ b/net/sunrpc/auth_gss/auth_gss.c
@@ -1334,6 +1334,7 @@  gss_validate(struct rpc_task *task, __be32 *p)
 	struct xdr_netobj mic;
 	u32		flav,len;
 	u32		maj_stat;
+	__be32		*ret = ERR_PTR(-EIO);
 
 	dprintk("RPC: %5u %s\n", task->tk_pid, __func__);
 
@@ -1349,6 +1350,7 @@  gss_validate(struct rpc_task *task, __be32 *p)
 	mic.data = (u8 *)p;
 	mic.len = len;
 
+	ret = ERR_PTR(-EACCES);
 	maj_stat = gss_verify_mic(ctx->gc_gss_ctx, &verf_buf, &mic);
 	if (maj_stat == GSS_S_CONTEXT_EXPIRED)
 		clear_bit(RPCAUTH_CRED_UPTODATE, &cred->cr_flags);
@@ -1366,8 +1368,9 @@  gss_validate(struct rpc_task *task, __be32 *p)
 	return p + XDR_QUADLEN(len);
 out_bad:
 	gss_put_ctx(ctx);
-	dprintk("RPC: %5u %s failed.\n", task->tk_pid, __func__);
-	return NULL;
+	dprintk("RPC: %5u %s failed ret %ld.\n", task->tk_pid, __func__,
+		PTR_ERR(ret));
+	return ret;
 }
 
 static void gss_wrap_req_encode(kxdreproc_t encode, struct rpc_rqst *rqstp,
diff --git a/net/sunrpc/auth_null.c b/net/sunrpc/auth_null.c
index a5c36c0..d60a673 100644
--- a/net/sunrpc/auth_null.c
+++ b/net/sunrpc/auth_null.c
@@ -84,17 +84,18 @@  nul_validate(struct rpc_task *task, __be32 *p)
 {
 	rpc_authflavor_t	flavor;
 	u32			size;
+	__be32			*ret = ERR_PTR(-EIO);
 
 	flavor = ntohl(*p++);
 	if (flavor != RPC_AUTH_NULL) {
 		printk("RPC: bad verf flavor: %u\n", flavor);
-		return NULL;
+		return ret;
 	}
 
 	size = ntohl(*p++);
 	if (size != 0) {
 		printk("RPC: bad verf size: %u\n", size);
-		return NULL;
+		return ret;
 	}
 
 	return p;
diff --git a/net/sunrpc/auth_unix.c b/net/sunrpc/auth_unix.c
index dc37021..461a444 100644
--- a/net/sunrpc/auth_unix.c
+++ b/net/sunrpc/auth_unix.c
@@ -186,19 +186,20 @@  unx_validate(struct rpc_task *task, __be32 *p)
 {
 	rpc_authflavor_t	flavor;
 	u32			size;
+	__be32			*ret = ERR_PTR(-EIO);
 
 	flavor = ntohl(*p++);
 	if (flavor != RPC_AUTH_NULL &&
 	    flavor != RPC_AUTH_UNIX &&
 	    flavor != RPC_AUTH_SHORT) {
 		printk("RPC: bad verf flavor: %u\n", flavor);
-		return NULL;
+		return ret;
 	}
 
 	size = ntohl(*p++);
 	if (size > RPC_MAX_AUTH_SIZE) {
 		printk("RPC: giant verf size: %u\n", size);
-		return NULL;
+		return ret;
 	}
 	task->tk_rqstp->rq_cred->cr_auth->au_rslack = (size >> 2) + 2;
 	p += (size >> 2);
diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c
index 68e8595..5efc89c 100644
--- a/net/sunrpc/clnt.c
+++ b/net/sunrpc/clnt.c
@@ -2090,7 +2090,8 @@  rpc_verify_header(struct rpc_task *task)
 		dprintk("RPC: %5u %s: XDR representation not a multiple of"
 		       " 4 bytes: 0x%x\n", task->tk_pid, __func__,
 		       task->tk_rqstp->rq_rcv_buf.len);
-		goto out_eio;
+		error = -EIO;
+		goto out_err;
 	}
 	if ((len -= 3) < 0)
 		goto out_overflow;
@@ -2099,6 +2100,7 @@  rpc_verify_header(struct rpc_task *task)
 	if ((n = ntohl(*p++)) != RPC_REPLY) {
 		dprintk("RPC: %5u %s: not an RPC reply: %x\n",
 			task->tk_pid, __func__, n);
+		error = -EIO;
 		goto out_garbage;
 	}
 
@@ -2117,7 +2119,8 @@  rpc_verify_header(struct rpc_task *task)
 			dprintk("RPC: %5u %s: RPC call rejected, "
 				"unknown error: %x\n",
 				task->tk_pid, __func__, n);
-			goto out_eio;
+			error = -EIO;
+			goto out_err;
 		}
 		if (--len < 0)
 			goto out_overflow;
@@ -2162,9 +2165,11 @@  rpc_verify_header(struct rpc_task *task)
 				task->tk_pid, __func__, n);
 		goto out_err;
 	}
-	if (!(p = rpcauth_checkverf(task, p))) {
-		dprintk("RPC: %5u %s: auth check failed\n",
-				task->tk_pid, __func__);
+	p = rpcauth_checkverf(task, p);
+	if (IS_ERR(p)) {
+		error = PTR_ERR(p);
+		dprintk("RPC: %5u %s: auth check failed with %d\n",
+				task->tk_pid, __func__, error);
 		goto out_garbage;		/* bad verifier, retry */
 	}
 	len = p - (__be32 *)iov->iov_base - 1;
@@ -2217,8 +2222,6 @@  out_garbage:
 out_retry:
 		return ERR_PTR(-EAGAIN);
 	}
-out_eio:
-	error = -EIO;
 out_err:
 	rpc_exit(task, error);
 	dprintk("RPC: %5u %s: call failed with error %d\n", task->tk_pid,