diff options
author | Jim Meyering <meyering@fb.com> | 2013-06-01 19:20:06 -0700 |
---|---|---|
committer | Jim Meyering <meyering@fb.com> | 2013-06-02 09:25:38 -0700 |
commit | 51a8f707131c36d7a88753e3bee839b2a4a336e4 (patch) | |
tree | f8aab34122568f6d1ca476d9d469e4d01125c77e | |
parent | aeaeb87c134ce748527ba99e749b7369fcba2438 (diff) | |
download | coreutils-51a8f707131c36d7a88753e3bee839b2a4a336e4.tar.xz |
od: -wN, N>64K, avoid misbehavior on systems with 32-bit size_t
* src/od.c (PRINT_FIELDS): Declare "i" to be of type uintmax_t, so that
the numerator in the expression for "next_pad" does not overflow.
(print_named_ascii): Likewise.
(print_ascii): Likewise.
Bug introduced via commit v6.12-42-g20c0b87.
* tests/misc/od.pl: Exercise each of the three affected code paths.
* NEWS (Bug fixes): Mention it.
Reported by Rich Burridge.
-rw-r--r-- | NEWS | 4 | ||||
-rw-r--r-- | THANKS.in | 1 | ||||
-rw-r--r-- | src/od.c | 6 | ||||
-rwxr-xr-x | tests/misc/od.pl | 7 |
4 files changed, 15 insertions, 3 deletions
@@ -18,6 +18,10 @@ GNU coreutils NEWS -*- outline -*- system such as GNU/Linux where directory ACL umasks override process umasks. [bug introduced in coreutils-6.0] + od -wN with N larger than 64K on a system with 32-bit size_t would + print approximately 2*N bytes of extraneous padding. + [Bug introduced in coreutils-7.0] + tail --retry -f now waits for the files specified to appear. Before, tail would immediately exit when such a file is inaccessible during the initial open. @@ -521,6 +521,7 @@ Ralph Loader loader@maths.ox.ac.uk Rasmus Borup Hansen rbh@intomics.com Raul Miller moth@magenta.com Raúl Núñez de Arenas Coronado raul@pleyades.net +Rich Burridge rich.burridge@oracle.com Richard A Downing richard.downing@bcs.org.uk Richard Braakman dark@xs4all.nl Richard Dawe rich@phekda.freeserve.co.uk @@ -400,7 +400,7 @@ N (size_t fields, size_t blank, void const *block, \ char const *FMT_STRING, int width, int pad) \ { \ T const *p = block; \ - size_t i; \ + uintmax_t i; \ int pad_remaining = pad; \ for (i = fields; blank < i; i--) \ { \ @@ -456,7 +456,7 @@ print_named_ascii (size_t fields, size_t blank, void const *block, int width, int pad) { unsigned char const *p = block; - size_t i; + uintmax_t i; int pad_remaining = pad; for (i = fields; blank < i; i--) { @@ -487,7 +487,7 @@ print_ascii (size_t fields, size_t blank, void const *block, int pad) { unsigned char const *p = block; - size_t i; + uintmax_t i; int pad_remaining = pad; for (i = fields; blank < i; i--) { diff --git a/tests/misc/od.pl b/tests/misc/od.pl index 0649b1c62..fb579aa90 100755 --- a/tests/misc/od.pl +++ b/tests/misc/od.pl @@ -57,6 +57,13 @@ my @Tests = # even if the kernel reports that the file has stat.st_size = 0. ['j-proc', "-An -c -j $proc_file_byte_count $proc_file", {IN=>{f2=>'e'}}, {OUT=>" e\n"}], + + # Ensure that a large width does not cause trouble. + # From coreutils-7.0 through coreutils-8.21, these would print + # approximately 128KiB of padding. + ['wide-a', '-a -w65537 -An', {IN=>{g=>'x'}}, {OUT=>" x\n"}], + ['wide-c', '-c -w65537 -An', {IN=>{g=>'x'}}, {OUT=>" x\n"}], + ['wide-x', '-tx1 -w65537 -An', {IN=>{g=>'B'}}, {OUT=>" 42\n"}], ); my $save_temps = $ENV{DEBUG}; |