shithub: riscv

Download patch

ref: b77eda8fc739976e6894186f9610f2c955a2fe01
parent: da6a10c417f16c26978b8db8c4fa0f35ac89ad73
author: cinap_lenrek <[email protected]>
date: Thu Nov 28 18:06:03 EST 2013

u9fs: fix misuse of Fcall.afid in p9any authentication module. (from sources patch/u9fs-afid)

U9fs(4) misuses Fcall.afid in its p9any authentication module.

The afid field of Fcall structure is only valid with Tauth or Tattach.
Tread, Twrite, Tclunk should use rx->fid instead.  It's been lucky so
far to get the job done because rx->afid survives from previous
Tauth/Tattach.  The issue pops up when several authentications happen
concurrently.

Test case:
	u9fs = 'host with u9fs on tcp!*!564'
	9fs $u9fs; for(i in 1 2 3 4 5 6 7 8){ 9fs $u9fs & }; wait
Should:
	no errors
Should not:
	mount failed: authentication failed

--- a/sys/src/cmd/unix/u9fs/authp9any.c
+++ b/sys/src/cmd/unix/u9fs/authp9any.c
@@ -367,9 +367,11 @@
 		return ep;
 	if (chatty9p)
 		fprint(2, "p9anyattach: afid %d state %d\n", rx->afid, sp->state);
-	if (sp->state == Established && strcmp(rx->uname, sp->uname) == 0
-		&& strcmp(rx->aname, sp->aname) == 0)
+	if(sp->state == Established && strcmp(rx->uname, sp->uname) == 0
+		&& strcmp(rx->aname, sp->aname) == 0){
+		rx->uname = sp->t.suid;
 		return nil;
+	}
 	return "authentication failed";
 }
 
@@ -392,7 +394,7 @@
 	char *ep;
 
 	Fid *f;
-	f = oldauthfid(rx->afid, (void **)&sp, &ep);
+	f = oldauthfid(rx->fid, (void **)&sp, &ep);
 	if (f == nil)
 		return ep;
 	if (chatty9p)
@@ -437,7 +439,7 @@
 
 	Fid *f;
 
-	f = oldauthfid(rx->afid, (void **)&sp, &ep);
+	f = oldauthfid(rx->fid, (void **)&sp, &ep);
 	if (f == nil)
 		return ep;
 	if (chatty9p)
@@ -515,7 +517,7 @@
 	AuthSession *sp;
 	char *ep;
 
-	f = oldauthfid(rx->afid, (void **)&sp, &ep);
+	f = oldauthfid(rx->fid, (void **)&sp, &ep);
 	if (f == nil)
 		return ep;
 	if (chatty9p)