Bug 1028511 - json-c: double handling issues (accuracy, thread safety)
json-c: double handling issues (accuracy, thread safety)
Product: Red Hat Enterprise Linux 7
Classification: Red Hat
Component: json-c (Show other bugs)
Unspecified Unspecified
unspecified Severity unspecified
: rc
: ---
Assigned To: Remi Collet
BaseOS QE - Apps
Depends On:
Blocks: 1028485
  Show dependency treegraph
Reported: 2013-11-08 10:54 EST by Florian Weimer
Modified: 2015-12-17 05:36 EST (History)
1 user (show)

See Also:
Fixed In Version:
Doc Type: Bug Fix
Doc Text:
Story Points: ---
Clone Of:
Last Closed: 2015-12-17 05:36:02 EST
Type: Bug
Regression: ---
Mount Type: ---
Documentation: ---
Verified Versions:
Category: ---
oVirt Team: ---
RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: ---

Attachments (Terms of Use)

  None (edit)
Description Florian Weimer 2013-11-08 10:54:34 EST
json_object_double_to_json_string() uses the %f conversion specifier to convert a double to a string:

  size = snprintf(buf, 128, "%f", jso->o.c_double);
  p = strchr(buf, ',');
  if (p) {
    *p = '.';
  } else {
    p = strchr(buf, '.');

This is lossy, it does not preserve all significant digits.  Exact conversion between binary and decimal floating point is difficult, and json-c should probably use gdtoa or grisu to implement this.  That would ensure nice-looking but accurate output, but it's a lot of code.  There is a width (18?) that ensures that %s is completely accurate, but I don't have the details at hand right now.

The decimal comma rewriting is also a bit suspect, but I couldn't get it to fail in a fa_IR locale (which is supposed to have neither a decimal point nor a decimal comma).
Comment 2 Florian Weimer 2013-11-08 11:22:38 EST
Decoding is not thread-safe because it switches the process LC_NUMERIC locale to C temporarily.  I strongly suspect this is done for the benefit of double parsing with sscanf, so it is related to this issue.
Comment 3 Florian Weimer 2013-11-11 11:21:19 EST
The accuracy issue is addressed in this upstream commit (assuming that "17" is large enough to preserve all digits, I haven't checked that).

Comment 5 Florian Weimer 2015-09-21 05:01:05 EDT
Reported upstream: https://github.com/json-c/json-c/issues/195

Note You need to log in before you can comment on or make changes to this bug.