Comments (5)
The cause is that the conversion from string to double, in strconv.c: jsonp_strtod
, uses the localeconv()
function, which is not multithread-safe (see POSIX https://pubs.opengroup.org/onlinepubs/9699919799/functions/localeconv.html ). In particular, in glibc, localeconv()
returns a pointer to a static
variable.
So, in thread1 with its English locale, localeconv()->decimal_point
is "."
, whereas in thread2 with its French locale, localeconv()->decimal_point
is ","
.
In thread1, when jsonp_strtod
is called on "1.5", it first calls to_locale(strbuffer)
. Here, it can happen that the return value of localeconv()
is disturbed by thread2, such that localeconv()->decimal_point
returns ","
. In this case, to_locale
produces the string "1,5". When strtod
is called on this string, it returns the number 1, and the end pointer points to the comma (rather than to the end of the string).
from jansson.
The fix is to use sprintf (buffer, "%#.0f", 1.0)
instead of localeconv()
. sprintf
is multithread-safe.
from jansson.
Thanks for the detailed bug report @bhaible! Do you think #677 would be the correct fix?
from jansson.
Do you think #677 would be the correct fix?
src/strconv.c
: The code change is correct, yes. But I would keep the comment in lines 17..25, since it is still valid and relevant even after this fix.
test/bin/json_process.c
, test/suites/api/util.h
: These changes needlessly reduce the test coverage. Before, with the setlocale (LC_ALL, "")
invocation, the test would use the "C" locale or an English locale on some machines, and a French or German locale (with a comma as decimal-point character) on other machines. If you remove the setlocale (LC_ALL, "")
invocation, the test uses the "C" locale always; this provides less coverage of relevant test scenarios.
from jansson.
Thanks! Fixed in #677.
from jansson.
Related Issues (20)
- feat: Add minimum permissions to workflows HOT 2
- Regarding Migration of Jansson 2.7 to 2.14
- json_dumps can only convert objects HOT 1
- How to use jansson with non-blocking I/O? HOT 1
- thread safety of json_incref and json_decref
- Can't create DLL on Windows for Jansson 1.2
- Cannot compile Jansson (make check fail) HOT 1
- "jansson_config.h" missing and cannot include the library in cmakelist HOT 2
- Create SECURITY.md HOT 1
- Error OOM HOT 2
- dump_string func can error return HOT 1
- json_int_t should be typedef'd as intmax_t
- Replacing values in a arbitrary JSON file HOT 1
- Target settings do not automatically populate when using CMake FetchContent HOT 1
- janssonConfig.cmake only packaged on Fedora and OpenMandriva HOT 2
- [question] multiple usage of json_set_alloc_funcs HOT 1
- Keep GitHub Actions up-to-date with dependabot
- json_dumps real value 7.6 as 7.59....96 HOT 9
- conversion from JSON to string is not multithread-safe HOT 3
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from jansson.