sbase

suckless unix tools
git clone git://git.suckless.org/sbase
Log | Files | Refs | README | LICENSE

commit 49e1854600bca3b2efbddd365d7b328fbcd0ced6
parent 5ae2793da60e06b5d804ca71e355e871166abfe8
Author: Michael Forney <mforney@mforney.org>
Date:   Fri,  8 Jul 2016 10:24:08 -0700

od: Don't advance past end of type string

Currently, if you specify -t x, then s is advanced once in the switch statement
to determine the length, and then once again in the for loop, resulting in a
read past the end of the argument.

Also, use sizeof(int) when no length is specified, as specified by POSIX.

Diffstat:
Mod.c | 20+++++++++-----------
1 file changed, 9 insertions(+), 11 deletions(-)

diff --git a/od.c b/od.c @@ -196,7 +196,7 @@ main(int argc, char *argv[]) { FILE *fp; struct type *t; - int ret = 0; + int ret = 0, len; char *s; big_endian = (*(uint16_t *)"\0\xff" == 0xff); @@ -244,30 +244,28 @@ main(int argc, char *argv[]) case 'o': case 'u': case 'x': - t = emalloc(sizeof(*t)); - t->format = *s; /* todo: allow multiple digits */ if (*(s+1) > '0' && *(s+1) <= '9') { - t->len = *(++s) - '0'; + len = *(s+1) - '0'; } else { - switch (*(++s)) { + switch (*(s+1)) { case 'C': - t->len = sizeof(char); + len = sizeof(char); break; case 'S': - t->len = sizeof(short); + len = sizeof(short); break; case 'I': - t->len = sizeof(int); + len = sizeof(int); break; case 'L': - t->len = sizeof(long); + len = sizeof(long); break; default: - t->len = 4; + len = sizeof(int); } } - TAILQ_INSERT_TAIL(&head, t, entry); + addtype(*s++, len); break; default: usage();