od_bloaty: fix floating point output
authorRon Yorston <rmy@pobox.com>
Wed, 19 Jul 2017 09:43:10 +0000 (10:43 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Wed, 19 Jul 2017 11:12:02 +0000 (13:12 +0200)
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>
coreutils/od_bloaty.c
testsuite/od.tests

index f13bdfc11cfb111c46f941641c3f516a27237b86..fa0196ca4fba398106962eabf7ce62dbe39c213b 100644 (file)
@@ -665,7 +665,7 @@ decode_one_format(const char *s_orig, const char *s, struct tspec *tspec)
                fmt = FLOATING_POINT;
                ++s;
                p = strchr(FDL, *s);
-               if (!p) {
+               if (!p || *p == '\0') {
                        size = sizeof(double);
                        if (isdigit(s[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];
+                       s++; /* skip F/D/L */
                }
 
                size_spec = fp_type_size[size];
index 7a9da3e9722308375a348c8d5644fa08d4456d6a..0880e0d2ff531c6d9a141137cc08d1c81114d826 100755 (executable)
@@ -16,6 +16,16 @@ testing "od -b" \
        "" "HELLO"
 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
 testing "od -b --traditional" \
        "od -b --traditional" \