aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--usr.bin/hexdump/conv.c4
-rw-r--r--usr.bin/hexdump/parse.c24
2 files changed, 18 insertions, 10 deletions
diff --git a/usr.bin/hexdump/conv.c b/usr.bin/hexdump/conv.c
index 96dc2d64c43b..ae4ea88337e0 100644
--- a/usr.bin/hexdump/conv.c
+++ b/usr.bin/hexdump/conv.c
@@ -57,7 +57,7 @@ conv_c(PR *pr, u_char *p, size_t bufsize)
wchar_t wc;
size_t clen, oclen;
int converr, pad, width;
- char peekbuf[MB_LEN_MAX];
+ u_char peekbuf[MB_LEN_MAX];
if (pr->mbleft > 0) {
str = "**";
@@ -107,7 +107,7 @@ retry:
if (clen == 0)
clen = 1;
else if (clen == (size_t)-1 || (clen == (size_t)-2 &&
- buf == peekbuf)) {
+ p == peekbuf)) {
memset(&pr->mbstate, 0, sizeof(pr->mbstate));
wc = *p;
clen = 1;
diff --git a/usr.bin/hexdump/parse.c b/usr.bin/hexdump/parse.c
index 07ad63d0fe24..5354675ad9de 100644
--- a/usr.bin/hexdump/parse.c
+++ b/usr.bin/hexdump/parse.c
@@ -259,7 +259,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';
@@ -453,13 +455,14 @@ 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++, p2++) {
+ if (*p1 == '\\') {
+ p1++;
+ switch(*p1) {
+ case '\0':
+ *p2 = '\\';
+ *++p2 = '\0';
+ return;
case 'a':
/* *p2 = '\a'; */
*p2 = '\007';
@@ -486,6 +489,11 @@ escape(char *p1)
*p2 = *p1;
break;
}
+ } else {
+ *p2 = *p1;
+ if (*p1 == '\0')
+ return;
+ }
}
}