Bug 1028511

Summary: json-c: double handling issues (accuracy, thread safety)
Product: Red Hat Enterprise Linux 7 Reporter: Florian Weimer <fweimer>
Component: json-cAssignee: Remi Collet <rcollet>
Status: CLOSED WONTFIX QA Contact: BaseOS QE - Apps <qe-baseos-apps>
Severity: unspecified Docs Contact:
Priority: unspecified    
Version: 7.0CC: jorton
Target Milestone: rc   
Target Release: ---   
Hardware: Unspecified   
OS: Unspecified   
Whiteboard:
Fixed In Version: Doc Type: Bug Fix
Doc Text:
Story Points: ---
Clone Of: Environment:
Last Closed: 2015-12-17 10:36:02 UTC Type: Bug
Regression: --- Mount Type: ---
Documentation: --- CRM:
Verified Versions: Category: ---
oVirt Team: --- RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: --- Target Upstream Version:
Embargoed:
Bug Depends On:    
Bug Blocks: 1028485    

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