od_bloaty: fix floating point output

Currently od_bloaty does this:

   $ /bin/echo -en '\x00\x00\x00\x00\x00\x00\x00\x00' | busybox od -f
   od: invalid character 'F' in type string 'fF'
   $ /bin/echo -en '\x00\x00\x00\x00\x00\x00\x00\x00' | busybox od -t fD
   od: invalid character 'D' in type string 'fD'
   $ /bin/echo -en '\x00\x00\x00\x00\x00\x00\x00\x00' | busybox od -t f
   0000000
   0000010

The first two occur because the alphabetic length specifier isn't being
properly skipped.  The third is due to the empty length specifier being
treated as alphabetic so we fall off the end of the FDL_sizeof array with
undetermined consequences.  Coreutils defaults to printing a double in
this case.

With this patch the output is:

   $ /bin/echo -en '\x00\x00\x00\x00\x00\x00\x00\x00' | ./busybox od -f
   0000000   0.0000000e+00   0.0000000e+00
   0000010
   $ /bin/echo -en '\x00\x00\x00\x00\x00\x00\x00\x00' | ./busybox od -t fD
   0000000   0.000000000000000e+00
   0000010
   $ /bin/echo -en '\x00\x00\x00\x00\x00\x00\x00\x00' | ./busybox od -t f
   0000000   0.000000000000000e+00
   0000010

I guess nobody uses BusyBox od to print floating point numbers.

Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Ron Yorston 2017-07-19 10:43:10 +01:00 committed by Denys Vlasenko
parent 9880f86d6e
commit a165603d24
2 changed files with 12 additions and 1 deletions

View File

@ -665,7 +665,7 @@ decode_one_format(const char *s_orig, const char *s, struct tspec *tspec)
fmt = FLOATING_POINT; fmt = FLOATING_POINT;
++s; ++s;
p = strchr(FDL, *s); p = strchr(FDL, *s);
if (!p) { if (!p || *p == '\0') {
size = sizeof(double); size = sizeof(double);
if (isdigit(s[0])) { if (isdigit(s[0])) {
size = bb_strtou(s, &end, 0); size = bb_strtou(s, &end, 0);
@ -686,6 +686,7 @@ decode_one_format(const char *s_orig, const char *s, struct tspec *tspec)
}; };
size = FDL_sizeof[p - FDL]; size = FDL_sizeof[p - FDL];
s++; /* skip F/D/L */
} }
size_spec = fp_type_size[size]; size_spec = fp_type_size[size];

View File

@ -16,6 +16,16 @@ testing "od -b" \
"" "HELLO" "" "HELLO"
SKIP= SKIP=
optional DESKTOP
testing "od -f" \
"od -f" \
"\
0000000 0.0000000e+00 0.0000000e+00
0000010
" \
"" "\x00\x00\x00\x00\x00\x00\x00\x00"
SKIP=
optional DESKTOP LONG_OPTS optional DESKTOP LONG_OPTS
testing "od -b --traditional" \ testing "od -b --traditional" \
"od -b --traditional" \ "od -b --traditional" \