summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2023-05-20 14:09:41 +0000
committercinap_lenrek <cinap_lenrek@felloff.net>2023-05-20 14:09:41 +0000
commit169aa63ec5a670d0c72b7e9fb747e16d76b718c3 (patch)
tree11c2309e8a99ec64e3de6450b735d8da1bba555a /sys
parente655f4b8bdd9da0c51bd4bece8a2ea2088e57236 (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.
Diffstat (limited to 'sys')
-rw-r--r--sys/src/9/ip/devip.c15
-rw-r--r--sys/src/9/ip/ipifc.c2
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)