Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 15 Dec 2007 18:09:53 GMT
From:      Mark Adler <madler@alumni.caltech.edu>
To:        freebsd-gnats-submit@FreeBSD.org
Subject:   misc/118723: [patch] od/hexdump truncates last partial repeat line
Message-ID:  <200712151809.lBFI9r87031927@www.freebsd.org>
Resent-Message-ID: <200712151820.lBFIK1Zt024579@freefall.freebsd.org>

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

>Number:         118723
>Category:       misc
>Synopsis:       [patch] od/hexdump truncates last partial repeat line
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Sat Dec 15 18:20:01 UTC 2007
>Closed-Date:
>Last-Modified:
>Originator:     Mark Adler
>Release:        hexdump 1.19 (same problem with 1.22)
>Organization:
>Environment:
Darwin gromit 8.11.0 Darwin Kernel Version 8.11.0: Wed Oct 10 18:26:00 PDT 2007; root:xnu-792.24.17~1/RELEASE_PPC Power Macintosh powerpc


>Description:
od and hexdump truncates the last line of the dump when that line partially repeats the previous line.
>How-To-Repeat:
Create this 40-byte file (including five newline characters):

abcdefg 
0123456 
abcdefg 
0123456 
abcdefg 

(Just the first three lines, 24 bytes, shows the same problem, but I included five lines to make the structure more evident.)

od on that file incorrectly gives:
0000000    060542  061544  062546  063412  030061  031063  032065 033012
*
0000040

which leaves off the last line "abcdefg\n", and incorrectly shows the final address as 40 octal (32 decimal).

Similarly, hexdump gives the following with the same issues:

0000000 6162 6364 6566 670a 3031 3233 3435 360a
*
0000020

With the patch below, od then correctly displays:

0000000    060542  061544  062546  063412  030061  031063  032065 033012
*
0000040    060542  061544  062546 063412
0000050

and hexdump then correctly displays:

0000000 6162 6364 6566 670a 3031 3233 3435 360a
*
0000020 6162 6364 6566 670a
0000028


>Fix:
Patch relative to latest version (1.22):

*** display-122.c       Tue Aug  3 19:47:32 2004
--- display.c   Sat Dec 15 09:51:26 2007
***************
*** 263,279 ****
                                errx(1, "cannot skip past end of input");
                        if (need == blocksize)
                                return((u_char *)NULL);
-                       /*
-                        * XXX bcmp() is not quite right in the presence
-                        * of multibyte characters.
-                        */
-                       if (vflag != ALL && 
-                           valid_save && 
-                           bcmp(curp, savp, nread) == 0) {
-                               if (vflag != DUP)
-                                       (void)printf("*\n");
-                               return((u_char *)NULL);
-                       }
                        bzero((char *)curp + nread, need);
                        eaddress = address + nread;
                        return(curp);
--- 263,268 ----



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



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