cJSON
cJSON copied to clipboard
cJSON_Version is not thread-safe
CJSON_PUBLIC(const char*) cJSON_Version(void)
{
static char version[15];
sprintf(version, "%i.%i.%i", CJSON_VERSION_MAJOR, CJSON_VERSION_MINOR, CJSON_VERSION_PATCH);
return version;
}
Suppose that two threads call cJSON_Version
concurrently, there is a data race in version
as sprintf
modifies it, which results in UB.
Since the version is a constant, and CJSON_VERSION_MAJOR
, CJSON_VERSION_MINOR
and CJSON_VERSION_PATCH
are macros, probably the easiest fix is to use macros for creating the resulting string at compile-time
#define STR_HELPER(x) #x
#define STR(x) STR_HELPER(x)
CJSON_PUBLIC(const char*) cJSON_Version(void)
{
return STR(CJSON_VERSION_MAJOR) "." STR(CJSON_VERSION_MINOR) "." STR(CJSON_VERSION_PATCH) ;
}