bio printf: Avoid using rounding errors in range check
authorBernd Edlinger <bernd.edlinger@hotmail.de>
Mon, 25 May 2020 18:13:47 +0000 (20:13 +0200)
committerBernd Edlinger <bernd.edlinger@hotmail.de>
Fri, 29 May 2020 13:23:33 +0000 (15:23 +0200)
commit082c041b4233b17b80129d4ac6b33a28014442b0
tree50e3c3bbe6b4d3a5d93ecea0c144d457b3323a55
parentf438f53a4e57462216be271c1c965550b6ff9941
bio printf: Avoid using rounding errors in range check

There is a problem casting ULONG_MAX to double which clang-10 is warning about.
ULONG_MAX typically cannot be exactly represented as a double.  ULONG_MAX + 1
can be and this fix uses the latter, however since ULONG_MAX cannot be
represented exactly as a double number we subtract 65535 from this number,
and the result has at most 48 leading one bits, and can therefore be
represented as a double integer without rounding error.  By adding
65536.0 to this number we achive the correct result, which should avoid the
warning.

The addresses a symptom of the underlying problem: we print doubles via an
unsigned long integer.  Doubles have a far greater range and should be printed
better.

Reviewed-by: Paul Dale <paul.dale@oracle.com>
(Merged from https://github.com/openssl/openssl/pull/11955)
crypto/bio/b_print.c
test/bioprinttest.c