Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 7 Jan 2012 23:15:22 +0000 (UTC)
From:      Eitan Adler <eadler@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r229794 - head/usr.bin/hexdump
Message-ID:  <201201072315.q07NFM3v060477@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: eadler (ports committer)
Date: Sat Jan  7 23:15:21 2012
New Revision: 229794
URL: http://svn.freebsd.org/changeset/base/229794

Log:
  - 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

Modified:
  head/usr.bin/hexdump/parse.c

Modified: head/usr.bin/hexdump/parse.c
==============================================================================
--- head/usr.bin/hexdump/parse.c	Sat Jan  7 22:29:46 2012	(r229793)
+++ head/usr.bin/hexdump/parse.c	Sat Jan  7 23:15:21 2012	(r229794)
@@ -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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201201072315.q07NFM3v060477>