From 66eac7d687219c71a9e3482f80b62de8b3693423 Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Mon, 21 May 2018 19:23:54 +0200 Subject: pc64: fix fpu bug fpurestore() unconditionally changed fpstate to FPinactive when the kernel used the FPU. but in the FPinit case, the registers are not saved by mathemu(), resulting in all zero initialized registers being loaded once userspace uses the FPU so the process would have wrong MXCR value. the index overflow check was wrong with using shifted value. --- sys/src/9/pc64/main.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/sys/src/9/pc64/main.c b/sys/src/9/pc64/main.c index 175f809bc..7e1b8449a 100644 --- a/sys/src/9/pc64/main.c +++ b/sys/src/9/pc64/main.c @@ -535,7 +535,7 @@ mathemu(Ureg *ureg, void*) case FPinit: fpinit(); index = up->fpstate >> FPindexs; - if(index < 0 || index > FPindexm) + if(index < 0 || index > (FPindexm>>FPindexs)) panic("fpslot index overflow: %d", index); if(userureg(ureg)){ if(index != 0) @@ -684,7 +684,7 @@ procsave(Proc *p) * emulation fault to activate the FPU. */ fpsave(p->fpsave); - p->fpstate = FPinactive | (p->fpstate & (FPpush|FPnouser|FPkernel|FPindexm)); + p->fpstate = FPinactive | (p->fpstate & ~FPactive); break; } @@ -729,7 +729,8 @@ fpurestore(int ostate) if((astate & ~(FPnouser|FPkernel|FPindexm)) == FPactive) _stts(); up->fpsave = up->fpslot[ostate>>FPindexs]; - ostate = FPinactive | (ostate & (FPillegal|FPpush|FPnouser|FPkernel|FPindexm)); + if(ostate & FPactive) + ostate = FPinactive | (ostate & ~FPactive); } up->fpstate = ostate; } -- cgit v1.2.3 From d5c906f51587975420b94c5a21aead9152864f18 Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Tue, 22 May 2018 01:53:15 +0200 Subject: ip/tftpd: deal with block wrap arround --- sys/src/cmd/ip/tftpd.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sys/src/cmd/ip/tftpd.c b/sys/src/cmd/ip/tftpd.c index e0569b959..bdba24432 100644 --- a/sys/src/cmd/ip/tftpd.c +++ b/sys/src/cmd/ip/tftpd.c @@ -542,9 +542,9 @@ awaitack(int fd, int block) if (Debug) syslog(dbg, flog, "tftpd %d read ack of %d bytes " "for block %d", pid, al, ackblock); - if(ackblock == block) + if(ackblock == (block & 0xffff)) return Ackok; /* for block just sent */ - else if(ackblock == block + 1) /* intel pxe eof bug */ + else if(ackblock == (block + 1 & 0xffff)) /* intel pxe eof bug */ return Ackok; else if(ackblock == 0xffff) return Ackrexmit; -- cgit v1.2.3 From 03ced8cca1c2c2911ba64e937af8436658d126d5 Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Wed, 23 May 2018 19:43:45 +0200 Subject: ndb/dnsquery: handle .ip6.arpa names, don't mount the dns service --- sys/man/8/ndb | 4 +- sys/src/cmd/ndb/dnsquery.c | 108 ++++++++++++++++++--------------------------- 2 files changed, 47 insertions(+), 65 deletions(-) diff --git a/sys/man/8/ndb b/sys/man/8/ndb index 868deff44..52fa8a009 100644 --- a/sys/man/8/ndb +++ b/sys/man/8/ndb @@ -49,7 +49,7 @@ query, ipquery, mkhash, mkdb, mkhosts, cs, csquery, dns, dnstcp, dnsquery, dnsde .B -s ] [ -.I server +.I /net/cs [ .I addr... ] @@ -91,6 +91,8 @@ query, ipquery, mkhash, mkdb, mkhosts, cs, csquery, dns, dnstcp, dnsquery, dnsde .B ndb/dnsquery [ .B -x +] [ +.I /net/dns ] .br .B ndb/dnsdebug diff --git a/sys/src/cmd/ndb/dnsquery.c b/sys/src/cmd/ndb/dnsquery.c index 8d0db85bf..67da3f4ca 100644 --- a/sys/src/cmd/ndb/dnsquery.c +++ b/sys/src/cmd/ndb/dnsquery.c @@ -6,35 +6,6 @@ #include "dns.h" #include "ip.h" -static int domount; -static char *mtpt, *dns, *srv; - -static int -setup(int argc, char **argv) -{ - int fd; - - if(argc == 1){ - domount = 0; - mtpt = argv[0]; - } - - fd = open(dns, ORDWR); - if(fd < 0){ - if(domount == 0) - sysfatal("can't open %s: %r", dns); - fd = open(srv, ORDWR); - if(fd < 0) - sysfatal("can't open %s: %r", srv); - if(mount(fd, -1, mtpt, MBEFORE, "") < 0) - sysfatal("can't mount(%s, %s): %r", srv, mtpt); - fd = open(dns, ORDWR); - if(fd < 0) - sysfatal("can't open %s: %r", dns); - } - return fd; -} - static void querydns(int fd, char *line, int n) { @@ -52,11 +23,37 @@ querydns(int fd, char *line, int n) } } +/* + * convert address into a reverse lookup address + */ +static void +mkptrname(char *ip, char *rip, int rlen) +{ + uchar a[IPaddrlen]; + char *p, *e; + int i; + + if(cistrstr(ip, "in-addr.arpa") || cistrstr(ip, "ip6.arpa") || parseip(a, ip) == -1) + snprint(rip, rlen, "%s", ip); + else if(isv4(a)) + snprint(rip, rlen, "%ud.%ud.%ud.%ud.in-addr.arpa", + a[15], a[14], a[13], a[12]); + else{ + p = rip; + e = rip + rlen; + for(i = 15; i >= 0; i--){ + p = seprint(p, e, "%ux.", a[i]&0xf); + p = seprint(p, e, "%ux.", a[i]>>4); + } + seprint(p, e, "ip6.arpa"); + } +} + static void query(int fd) { - int n, len; - char *lp, *p, *np; + int n; + char *lp; char buf[1024], line[1024]; Biobuf in; @@ -84,31 +81,10 @@ query(int fd) n += 3; } - /* inverse queries may need to be permuted */ - if(n > 4 && strcmp(" ptr", &line[n-4]) == 0 && - cistrstr(line, ".arpa") == nil){ - /* TODO: reversing v6 addrs is harder */ - for(p = line; *p; p++) - if(*p == ' '){ - *p = '.'; - break; - } - np = buf; - len = 0; - while(p >= line){ - len++; - p--; - if(*p == '.'){ - memmove(np, p+1, len); - np += len; - len = 0; - } - } - memmove(np, p+1, len); - np += len; - strcpy(np, "in-addr.arpa ptr"); /* TODO: ip6.arpa for v6 */ - strcpy(line, buf); - n = strlen(line); + if(n > 4 && strcmp(" ptr", &line[n-4]) == 0){ + line[n-4] = 0; + mkptrname(line, buf, sizeof buf); + n = snprint(line, sizeof line, "%s ptr", buf); } querydns(fd, line, n); @@ -119,21 +95,25 @@ query(int fd) void main(int argc, char *argv[]) { - mtpt = "/net"; - dns = "/net/dns"; - srv = "/srv/dns"; - domount = 1; + char *dns = "/net/dns"; + int fd; + ARGBEGIN { case 'x': - mtpt = "/net.alt"; dns = "/net.alt/dns"; - srv = "/srv/dns_net.alt"; break; default: - fprint(2, "usage: %s [-x] [dns-mount-point]\n", argv0); + fprint(2, "usage: %s [-x] [/net/dns]\n", argv0); exits("usage"); } ARGEND; - query(setup(argc, argv)); + if(argc > 0) + dns = argv[0]; + + fd = open(dns, ORDWR); + if(fd < 0) + sysfatal("can't open %s: %r", dns); + + query(fd); exits(0); } -- cgit v1.2.3 From ad7390dda820db424821b19c572a44b4cc0838e8 Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Wed, 23 May 2018 19:44:12 +0200 Subject: ndb/dnsdebug: handle .ip6.arpa names --- sys/src/cmd/ndb/dnsdebug.c | 66 ++++++++++++++++++++++++++-------------------- 1 file changed, 37 insertions(+), 29 deletions(-) diff --git a/sys/src/cmd/ndb/dnsdebug.c b/sys/src/cmd/ndb/dnsdebug.c index b2f3cebf2..01377598a 100644 --- a/sys/src/cmd/ndb/dnsdebug.c +++ b/sys/src/cmd/ndb/dnsdebug.c @@ -121,6 +121,32 @@ longtime(long t) return x; } +/* + * convert address into a reverse lookup address + */ +static void +mkptrname(char *ip, char *rip, int rlen) +{ + uchar a[IPaddrlen]; + char *p, *e; + int i; + + if(cistrstr(ip, "in-addr.arpa") || cistrstr(ip, "ip6.arpa") || parseip(a, ip) == -1) + snprint(rip, rlen, "%s", ip); + else if(isv4(a)) + snprint(rip, rlen, "%ud.%ud.%ud.%ud.in-addr.arpa", + a[15], a[14], a[13], a[12]); + else{ + p = rip; + e = rip + rlen; + for(i = 15; i >= 0; i--){ + p = seprint(p, e, "%ux.", a[i]&0xf); + p = seprint(p, e, "%ux.", a[i]>>4); + } + seprint(p, e, "ip6.arpa"); + } +} + int prettyrrfmt(Fmt *f) { @@ -372,7 +398,6 @@ void doquery(char *name, char *tstr) { int len, type, rooted; - char *p, *np; char buf[1024]; RR *rr, *rp; Request req; @@ -387,6 +412,13 @@ doquery(char *name, char *tstr) else tstr = "ip"; + /* look it up */ + type = rrtype(tstr); + if(type < 0){ + print("!unknown type %s\n", tstr); + return; + } + /* if name end in '.', remove it */ len = strlen(name); if(len > 0 && name[len-1] == '.'){ @@ -396,34 +428,10 @@ doquery(char *name, char *tstr) rooted = 0; /* inverse queries may need to be permuted */ - strncpy(buf, name, sizeof buf); - if(strcmp("ptr", tstr) == 0 && cistrstr(name, ".arpa") == nil){ - /* TODO: reversing v6 addrs is harder */ - for(p = name; *p; p++) - ; - *p = '.'; - np = buf; - len = 0; - while(p >= name){ - len++; - p--; - if(*p == '.'){ - memmove(np, p+1, len); - np += len; - len = 0; - } - } - memmove(np, p+1, len); - np += len; - strcpy(np, "in-addr.arpa"); /* TODO: ip6.arpa for v6 */ - } - - /* look it up */ - type = rrtype(tstr); - if(type < 0){ - print("!unknown type %s\n", tstr); - return; - } + if(type == Tptr) + mkptrname(name, buf, sizeof buf); + else + strncpy(buf, name, sizeof buf); memset(&req, 0, sizeof req); getactivity(&req, 0); -- cgit v1.2.3