diff options
author | Ron Yorston | 2017-07-19 10:43:10 +0100 |
---|---|---|
committer | Denys Vlasenko | 2017-07-19 13:12:02 +0200 |
commit | a165603d24dc3b5080859abfa834d092f456489d (patch) | |
tree | cc418520ca4343d57cb99678187e76e991885c0e | |
parent | 9880f86d6e68a2a9b0d691ad0667f38d73eb89e0 (diff) | |
download | busybox-a165603d24dc3b5080859abfa834d092f456489d.zip busybox-a165603d24dc3b5080859abfa834d092f456489d.tar.gz |
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>
-rw-r--r-- | coreutils/od_bloaty.c | 3 | ||||
-rwxr-xr-x | testsuite/od.tests | 10 |
2 files changed, 12 insertions, 1 deletions
diff --git a/coreutils/od_bloaty.c b/coreutils/od_bloaty.c index f13bdfc..fa0196c 100644 --- a/coreutils/od_bloaty.c +++ b/coreutils/od_bloaty.c @@ -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]; diff --git a/testsuite/od.tests b/testsuite/od.tests index 7a9da3e..0880e0d 100755 --- a/testsuite/od.tests +++ b/testsuite/od.tests @@ -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" \ |