diff options
author | eadler <eadler@FreeBSD.org> | 2012-01-07 23:15:21 +0000 |
---|---|---|
committer | eadler <eadler@FreeBSD.org> | 2012-01-07 23:15:21 +0000 |
commit | 2e1d42460b2cdbe4d945abb4ab9225521086081e (patch) | |
tree | 8390cab5b147ce6b0e32a7801857882296498d36 /usr.bin | |
parent | bb6e0c39393772b71f38276e21b813233f9136e5 (diff) | |
download | FreeBSD-src-2e1d42460b2cdbe4d945abb4ab9225521086081e.zip FreeBSD-src-2e1d42460b2cdbe4d945abb4ab9225521086081e.tar.gz |
- Fix how hexdump parses escape strings
From the NetBSD bug:
The way how hexdump(1) parses escape sequences has some bugs.
It shows up when an escape sequence is used as the non-last character
of a format string.
PR: bin/144722
Submitted by: gcooper
Approved by: rpaulo
Obtained from: NetBSD
MFC after: 1 week
Diffstat (limited to 'usr.bin')
-rw-r--r-- | usr.bin/hexdump/parse.c | 31 |
1 files changed, 23 insertions, 8 deletions
diff --git a/usr.bin/hexdump/parse.c b/usr.bin/hexdump/parse.c index 0fa24f5..a87eddb 100644 --- a/usr.bin/hexdump/parse.c +++ b/usr.bin/hexdump/parse.c @@ -255,7 +255,9 @@ rewrite(FS *fs) sokay = NOTOKAY; } - p2 = p1 + 1; /* Set end pointer. */ + p2 = *p1 ? p1 + 1 : p1; /* Set end pointer -- make sure + * that it's non-NUL/-NULL first + * though. */ cs[0] = *p1; /* Set conversion string. */ cs[1] = '\0'; @@ -449,13 +451,21 @@ escape(char *p1) char *p2; /* alphabetic escape sequences have to be done in place */ - for (p2 = p1;; ++p1, ++p2) { - if (!*p1) { - *p2 = *p1; - break; - } - if (*p1 == '\\') - switch(*++p1) { + for (p2 = p1; *p1; p1++, p2++) { + /* + * Let's take a peak at the next item and see whether or not + * we need to escape the value... + */ + if (*p1 == '\\') { + + p1++; + + switch(*p1) { + /* A standalone `\' */ + case '\0': + *p2 = '\\'; + *++p2 = '\0'; + break; case 'a': /* *p2 = '\a'; */ *p2 = '\007'; @@ -482,7 +492,12 @@ escape(char *p1) *p2 = *p1; break; } + + } else + *p2 = *p1; + } + } void |