diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2023-05-20 14:09:41 +0000 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2023-05-20 14:09:41 +0000 |
commit | 169aa63ec5a670d0c72b7e9fb747e16d76b718c3 (patch) | |
tree | 11c2309e8a99ec64e3de6450b735d8da1bba555a | |
parent | e655f4b8bdd9da0c51bd4bece8a2ea2088e57236 (diff) |
devip: provide large buffer for ipifc->local() generator
The ipifc->local generator is the big exception,
dumping the whole link structure of the interface.
-rw-r--r-- | sys/src/9/ip/devip.c | 15 | ||||
-rw-r--r-- | sys/src/9/ip/ipifc.c | 2 |
2 files changed, 13 insertions, 4 deletions
diff --git a/sys/src/9/ip/devip.c b/sys/src/9/ip/devip.c index 032f53104..8a9824c10 100644 --- a/sys/src/9/ip/devip.c +++ b/sys/src/9/ip/devip.c @@ -93,7 +93,7 @@ ip3gen(Chan *c, int i, Dir *dp) p = "remote"; break; case Qsnoop: - if(strcmp(cv->p->name, "ipifc") != 0) + if(cv->p != ipfs[c->dev]->ipifc) return -1; devdir(c, q, "snoop", qlen(cv->sq), cv->owner, 0400, dp); return 1; @@ -674,13 +674,22 @@ ipread(Chan *ch, void *a, long n, vlong off) } goto Readstr; case Qlocal: + x = f->p[PROTO(ch->qid)]; + c = x->conv[CONV(ch->qid)]; + if(x == f->ipifc && x->local != nil){ + buf = smalloc(Maxstate); + if(waserror()){ + free(buf); + nexterror(); + } + (*x->local)(c, buf, Maxstate); + goto Readstr; + } buf = smalloc(Maxstring); if(waserror()){ free(buf); nexterror(); } - x = f->p[PROTO(ch->qid)]; - c = x->conv[CONV(ch->qid)]; if(x->local == nil) { snprint(buf, Maxstring, "%I!%d\n", c->laddr, c->lport); } else { diff --git a/sys/src/9/ip/ipifc.c b/sys/src/9/ip/ipifc.c index b6f615084..c79f2cc64 100644 --- a/sys/src/9/ip/ipifc.c +++ b/sys/src/9/ip/ipifc.c @@ -267,7 +267,7 @@ ipifcstate(Conv *c, char *state, int n) ifc->in, ifc->out, ifc->inerr, ifc->outerr, ifc->speed, ifc->delay); - for(lifc = ifc->lifc; lifc != nil && n > m; lifc = lifc->next) + for(lifc = ifc->lifc; lifc != nil; lifc = lifc->next) m += snprint(state+m, n - m, slineformat, lifc->local, lifc->mask, lifc->remote, lifc->validlt, lifc->preflt); if(ifc->lifc == nil) |