summaryrefslogtreecommitdiff
path: root/sys/src/libauthsrv/_asgetresp.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2016-01-06 03:09:00 +0100
committercinap_lenrek <cinap_lenrek@felloff.net>2016-01-06 03:09:00 +0100
commit2dae1ed53a73d81bfb86778793a6bda265d5140d (patch)
treee037c4a663fc9d17906cc2045c488232ac223ece /sys/src/libauthsrv/_asgetresp.c
parente064752dd476b7a2f76567f8cc15f9c2645e5d3d (diff)
auth: release dp9ik implementation and reentrant factotum
Diffstat (limited to 'sys/src/libauthsrv/_asgetresp.c')
-rw-r--r--sys/src/libauthsrv/_asgetresp.c36
1 files changed, 24 insertions, 12 deletions
diff --git a/sys/src/libauthsrv/_asgetresp.c b/sys/src/libauthsrv/_asgetresp.c
index da0e2bd20..3f7cb5d4f 100644
--- a/sys/src/libauthsrv/_asgetresp.c
+++ b/sys/src/libauthsrv/_asgetresp.c
@@ -5,28 +5,40 @@
int
_asgetresp(int fd, Ticket *t, Authenticator *a, Authkey *k)
{
- char tbuf[TICKETLEN+AUTHENTLEN];
+ char buf[MAXTICKETLEN+MAXAUTHENTLEN], err[ERRMAX];
int n, m;
- m = TICKETLEN;
memset(t, 0, sizeof(Ticket));
- if(a != nil){
- m += AUTHENTLEN;
+ if(a != nil)
memset(a, 0, sizeof(Authenticator));
- }
- n = _asrdresp(fd, tbuf, m);
- if(n <= 0)
- return -1;
+ strcpy(err, "AS protocol botch");
+ errstr(err, ERRMAX);
- m = convM2T(tbuf, n, t, k);
- if(m <= 0)
+ if(_asrdresp(fd, buf, 0) < 0)
return -1;
- if(a != nil){
- if(convM2A(tbuf+m, n-m, a, t) <= 0)
+ for(n = 0; (m = convM2T(buf, n, t, k)) <= 0; n += m){
+ m = -m;
+ if(m <= n || m > sizeof(buf))
+ return -1;
+ m -= n;
+ if(readn(fd, buf+n, m) != m)
return -1;
}
+ if(a != nil){
+ for(n = 0; (m = convM2A(buf, n, a, t)) <= 0; n += m){
+ m = -m;
+ if(m <= n || m > sizeof(buf))
+ return -1;
+ m -= n;
+ if(readn(fd, buf+n, m) != m)
+ return -1;
+ }
+ }
+
+ errstr(err, ERRMAX);
+
return 0;
}