misc/118723: [patch] od/hexdump truncates last partial repeat line
Mark Adler
madler at alumni.caltech.edu
Sat Dec 15 10:20:01 PST 2007
>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:
More information about the freebsd-bugs
mailing list