Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 14 Mar 2010 00:11:42 GMT
From:      Garrett Cooper <gcooper@FreeBSD.org>
To:        freebsd-gnats-submit@FreeBSD.org
Subject:   bin/144722: [patch] port over character escape fix for hexdump in NetBSD PR # 28157
Message-ID:  <201003140011.o2E0Bg8G077170@www.freebsd.org>
Resent-Message-ID: <201003140020.o2E0K2wu061733@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         144722
>Category:       bin
>Synopsis:       [patch] port over character escape fix for hexdump in NetBSD PR # 28157
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Sun Mar 14 00:20:02 UTC 2010
>Closed-Date:
>Last-Modified:
>Originator:     Garrett Cooper
>Release:        9-CURRENT
>Organization:
Cisco Systems, Inc.
>Environment:
FreeBSD bayonetta.localdomain 9.0-CURRENT FreeBSD 9.0-CURRENT #2: Thu Mar  4 13:16:39 PST 2010     gcooper@bayonetta.localdomain:/usr/obj/usr/src/sys/BAYONETTA  amd64
>Description:
A number of \\ and \n related escaping bugs are reported in NetBSD PR # 28157 which were fixed quite a while ago in NetBSD's copy of hexdump, but not FreeBSD's copy of hexdump.

The attached patch is a minimal change which merges the fixes present in NetBSD's hexdump with our copy of hexdump (some of the fixes in the patch provided in the NetBSD PR had been orthogonally fixed in our hexdump).
>How-To-Repeat:
% hexdump -e '8/1 "\\x%02x" "\n"' /path/to/some/data
hexdump: %
: bad conversion character 
% hexdump -e '1/1 "\\x%02x"' /path/to/some/data
Segmentation fault (core dumped)
% hexdump -e '1/1 "\nx"' /path/to/some/data
--> many 'n's are output. (instead of 'x's)
>Fix:
See attached patch.

Patch attached with submission follows:

Index: parse.c
===================================================================
--- parse.c	(revision 205137)
+++ parse.c	(working copy)
@@ -259,7 +259,9 @@
 					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,21 @@
 	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';
@@ -486,7 +496,13 @@
 				*p2 = *p1;
 				break;
 			}
+
+		} else {
+			*p2 = *p1;
+		}
+
 	}
+
 }
 
 void


>Release-Note:
>Audit-Trail:
>Unformatted:



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