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)