Issue #539: use a internal-only serializer function in json_object_new_double_s() to avoid potential conflicts with user code that uses the json_object_userdata_to_json_string serializer. Also, document the serializer-resetting behavior of json_object_set_double().

This commit is contained in:
Eric Haszlakiewicz
2020-02-14 03:48:02 +00:00
parent 4bf7ffa984
commit 518f337ce8
2 changed files with 21 additions and 4 deletions

View File

@@ -53,6 +53,7 @@ static json_object_to_json_string_fn json_object_double_to_json_string_default;
static json_object_to_json_string_fn json_object_int_to_json_string;
static json_object_to_json_string_fn json_object_string_to_json_string;
static json_object_to_json_string_fn json_object_array_to_json_string;
static json_object_to_json_string_fn _json_object_userdata_to_json_string;
/* ref count debugging */
@@ -921,11 +922,22 @@ struct json_object* json_object_new_double_s(double d, const char *ds)
errno = ENOMEM;
return NULL;
}
json_object_set_serializer(jso, json_object_userdata_to_json_string,
json_object_set_serializer(jso, _json_object_userdata_to_json_string,
new_ds, json_object_free_userdata);
return jso;
}
/*
* A wrapper around json_object_userdata_to_json_string() used only
* by json_object_new_double_s() just so json_object_set_double() can
* detect when it needs to reset the serializer to the default.
*/
static int _json_object_userdata_to_json_string(struct json_object *jso,
struct printbuf *pb, int level, int flags)
{
return json_object_userdata_to_json_string(jso, pb, level, flags);
}
int json_object_userdata_to_json_string(struct json_object *jso,
struct printbuf *pb, int level, int flags)
{
@@ -999,7 +1011,7 @@ int json_object_set_double(struct json_object *jso,double new_value){
if (!jso || jso->o_type!=json_type_double)
return 0;
jso->o.c_double=new_value;
if (jso->_to_json_string == &json_object_userdata_to_json_string)
if (jso->_to_json_string == &_json_object_userdata_to_json_string)
json_object_set_serializer(jso, NULL, NULL, NULL);
return 1;
}
@@ -1354,7 +1366,8 @@ static int json_object_copy_serializer_data(struct json_object *src, struct json
if (!src->_userdata && !src->_user_delete)
return 0;
if (dst->_to_json_string == json_object_userdata_to_json_string)
if (dst->_to_json_string == json_object_userdata_to_json_string ||
dst->_to_json_string == _json_object_userdata_to_json_string)
{
dst->_userdata = strdup(src->_userdata);
}