From a165603d24dc3b5080859abfa834d092f456489d Mon Sep 17 00:00:00 2001 From: Ron Yorston Date: Wed, 19 Jul 2017 10:43:10 +0100 Subject: 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 Signed-off-by: Denys Vlasenko --- coreutils/od_bloaty.c | 3 ++- testsuite/od.tests | 10 ++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/coreutils/od_bloaty.c b/coreutils/od_bloaty.c index f13bdfc11..fa0196ca4 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 7a9da3e97..0880e0d2f 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" \ -- cgit v1.2.3