summaryrefslogtreecommitdiff
path: root/sys/src/cmd/ip
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2014-11-07 12:51:59 +0100
committercinap_lenrek <cinap_lenrek@felloff.net>2014-11-07 12:51:59 +0100
commit797cc13c7053dbdd16c20dc4dee5aee8c92390b0 (patch)
tree5aa7a00f0edeb1d2938d2dff116ee37f2570e8a5 /sys/src/cmd/ip
parent5364fa720de3b963a88dc4810ed83b4f2ab11d12 (diff)
fix dangerous werrstr() usages
werrstr() takes a format string as its first argument. a common error is to pass user controlled string buffers into werrstr() that might contain format string escapes causing werrstr() to take bogus arguments from the stack and crash. so instead of doing: werrstr(buf); we want todo: werrstr("%s", buf); or if we have a local ERRMAX sized buffer that we can override: errstr(buf, sizeof buf);
Diffstat (limited to 'sys/src/cmd/ip')
-rw-r--r--sys/src/cmd/ip/ftpd.c3
-rw-r--r--sys/src/cmd/ip/ftpfs/proto.c2
-rw-r--r--sys/src/cmd/ip/tftpfs.c2
-rw-r--r--sys/src/cmd/ip/traceroute.c22
4 files changed, 14 insertions, 15 deletions
diff --git a/sys/src/cmd/ip/ftpd.c b/sys/src/cmd/ip/ftpd.c
index 8626ab47e..1aa395b89 100644
--- a/sys/src/cmd/ip/ftpd.c
+++ b/sys/src/cmd/ip/ftpd.c
@@ -160,14 +160,11 @@ logit(char *fmt, ...)
{
char buf[8192];
va_list arg;
- char errstr[ERRMAX];
- rerrstr(errstr, sizeof errstr);
va_start(arg, fmt);
vseprint(buf, buf+sizeof(buf), fmt, arg);
va_end(arg);
syslog(0, FTPLOG, "%s.%s %s", nci->rsys, nci->rserv, buf);
- werrstr(errstr, sizeof errstr);
}
static void
diff --git a/sys/src/cmd/ip/ftpfs/proto.c b/sys/src/cmd/ip/ftpfs/proto.c
index 14fe56ee9..cf4cb0f99 100644
--- a/sys/src/cmd/ip/ftpfs/proto.c
+++ b/sys/src/cmd/ip/ftpfs/proto.c
@@ -1324,7 +1324,7 @@ passive(int mode, Biobuf **bpp, char *cmda, char *cmdb)
close(fd);
if(debug)
fprint(2, "passive mode retrieve failed: %s\n", msg);
- werrstr(msg);
+ werrstr("%s", msg);
return x;
}
diff --git a/sys/src/cmd/ip/tftpfs.c b/sys/src/cmd/ip/tftpfs.c
index 7f1fcb003..fa84d2b1d 100644
--- a/sys/src/cmd/ip/tftpfs.c
+++ b/sys/src/cmd/ip/tftpfs.c
@@ -212,7 +212,7 @@ download(void *aux)
msg.buf[n] = 0;
switch(nhgets(msg.buf)){
case Tftp_ERROR:
- werrstr((char*)msg.buf+4);
+ werrstr("%s", (char*)msg.buf+4);
err = "%r";
goto out;
diff --git a/sys/src/cmd/ip/traceroute.c b/sys/src/cmd/ip/traceroute.c
index 33b6678b2..3113d6ded 100644
--- a/sys/src/cmd/ip/traceroute.c
+++ b/sys/src/cmd/ip/traceroute.c
@@ -140,8 +140,7 @@ static int
udpprobe(int cfd, int dfd, char *dest, int interval)
{
int n, i, rv;
- char msg[Maxstring];
- char err[Maxstring];
+ char msg[Maxstring], err[ERRMAX];
seek(cfd, 0, 0);
n = snprint(msg, sizeof msg, "connect %s", dest);
@@ -166,12 +165,13 @@ udpprobe(int cfd, int dfd, char *dest, int interval)
rv = 0;
break;
}
+ *err = 0;
errstr(err, sizeof err);
- if(strstr(err, "alarm") == 0){
- werrstr(err);
+ if(strcmp(err, "interrupted") != 0){
+ errstr(err, sizeof err);
break;
}
- werrstr(err);
+ errstr(err, sizeof err);
}
alarm(0);
return rv;
@@ -185,7 +185,7 @@ static int
icmpprobe(int cfd, int dfd, char *dest, int interval)
{
int x, i, n, len, rv;
- char buf[512], err[Maxstring], msg[Maxstring];
+ char buf[512], err[ERRMAX], msg[Maxstring];
Icmphdr *ip;
seek(cfd, 0, 0);
@@ -212,12 +212,13 @@ icmpprobe(int cfd, int dfd, char *dest, int interval)
n = read(dfd, buf, sizeof(buf));
alarm(0);
if(n < 0){
+ *err = 0;
errstr(err, sizeof err);
- if(strstr(err, "alarm") == 0){
- werrstr(err);
+ if(strcmp(err, "interrupted") != 0){
+ errstr(err, sizeof err);
break;
}
- werrstr(err);
+ errstr(err, sizeof err);
continue;
}
x = (ip->seq[1]<<8) | ip->seq[0];
@@ -337,7 +338,7 @@ main(int argc, char **argv)
long *t;
char *net, *p;
char clone[Maxpath], dest[Maxstring], hop[Maxstring], dom[Maxstring];
- char err[Maxstring];
+ char err[ERRMAX];
DS ds;
buckets = 0;
@@ -396,6 +397,7 @@ main(int argc, char **argv)
done = 1;
continue;
}
+ *err = 0;
errstr(err, sizeof err);
if(strstr(err, "refused")){
strcpy(hop, dest);