Bug 1028511 - json-c: double handling issues (accuracy, thread safety)
Summary: json-c: double handling issues (accuracy, thread safety)
Keywords:
Status: CLOSED WONTFIX
Alias: None
Product: Red Hat Enterprise Linux 7
Classification: Red Hat
Component: json-c
Version: 7.0
Hardware: Unspecified
OS: Unspecified
unspecified
unspecified
Target Milestone: rc
: ---
Assignee: Remi Collet
QA Contact: BaseOS QE - Apps
URL:
Whiteboard:
Depends On:
Blocks: 1028485
TreeView+ depends on / blocked
 
Reported: 2013-11-08 15:54 UTC by Florian Weimer
Modified: 2015-12-17 10:36 UTC (History)
1 user (show)

Fixed In Version:
Doc Type: Bug Fix
Doc Text:
Clone Of:
Environment:
Last Closed: 2015-12-17 10:36:02 UTC
Target Upstream Version:


Attachments (Terms of Use)

Description Florian Weimer 2013-11-08 15:54:34 UTC
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 16:22:38 UTC
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 16:21:19 UTC
The accuracy issue is addressed in this upstream commit (assuming that "17" is large enough to preserve all digits, I haven't checked that).

https://github.com/json-c/json-c/commit/06450206c4f3de4af8d81bb6d93e9db1d5fedec1

Comment 5 Florian Weimer 2015-09-21 09:01:05 UTC
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.