mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-22 05:35:25 +00:00
json: do not call json_tokener_free with NULL
Add an error message for the rare case if json_tokener_new fails (allocation failure) and guard any use of json_tokener_free where tok might be NULL (this was possible in libvirt-nss when the json file could not be opened). https://gitlab.com/libvirt/libvirt/-/issues/581 Signed-off-by: Ján Tomko <jtomko@redhat.com> Reported-by: Simon Pilkington Reviewed-by: Peter Krempa <pkrempa@redhat.com> Reviewed-by: Richard W.M. Jones <rjones@redhat.com>
This commit is contained in:
parent
23d78e1c58
commit
faf6edfa74
@ -1462,6 +1462,11 @@ virJSONValueFromString(const char *jsonstring)
|
|||||||
VIR_DEBUG("string=%s", jsonstring);
|
VIR_DEBUG("string=%s", jsonstring);
|
||||||
|
|
||||||
tok = json_tokener_new();
|
tok = json_tokener_new();
|
||||||
|
if (!tok) {
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
|
_("failed to create JSON tokener"));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
json_tokener_set_flags(tok, jsonflags);
|
json_tokener_set_flags(tok, jsonflags);
|
||||||
jobj = json_tokener_parse_ex(tok, jsonstring, strlen(jsonstring));
|
jobj = json_tokener_parse_ex(tok, jsonstring, strlen(jsonstring));
|
||||||
jerr = json_tokener_get_error(tok);
|
jerr = json_tokener_get_error(tok);
|
||||||
@ -1475,7 +1480,8 @@ virJSONValueFromString(const char *jsonstring)
|
|||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
json_object_put(jobj);
|
json_object_put(jobj);
|
||||||
json_tokener_free(tok);
|
if (tok)
|
||||||
|
json_tokener_free(tok);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -272,6 +272,10 @@ findLeases(const char *file,
|
|||||||
}
|
}
|
||||||
|
|
||||||
tok = json_tokener_new();
|
tok = json_tokener_new();
|
||||||
|
if (!tok) {
|
||||||
|
ERROR("failed to create JSON tokener");
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
json_tokener_set_flags(tok, jsonflags);
|
json_tokener_set_flags(tok, jsonflags);
|
||||||
|
|
||||||
do {
|
do {
|
||||||
@ -301,7 +305,8 @@ findLeases(const char *file,
|
|||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
json_object_put(jobj);
|
json_object_put(jobj);
|
||||||
json_tokener_free(tok);
|
if (tok)
|
||||||
|
json_tokener_free(tok);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
free(*addrs);
|
free(*addrs);
|
||||||
*addrs = NULL;
|
*addrs = NULL;
|
||||||
|
@ -134,6 +134,10 @@ findMACs(const char *file,
|
|||||||
}
|
}
|
||||||
|
|
||||||
tok = json_tokener_new();
|
tok = json_tokener_new();
|
||||||
|
if (!tok) {
|
||||||
|
ERROR("failed to create JSON tokener");
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
json_tokener_set_flags(tok, jsonflags);
|
json_tokener_set_flags(tok, jsonflags);
|
||||||
|
|
||||||
do {
|
do {
|
||||||
@ -162,7 +166,8 @@ findMACs(const char *file,
|
|||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
json_object_put(jobj);
|
json_object_put(jobj);
|
||||||
json_tokener_free(tok);
|
if (tok)
|
||||||
|
json_tokener_free(tok);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
for (i = 0; i < *nmacs; i++) {
|
for (i = 0; i < *nmacs; i++) {
|
||||||
char *mac = (*macs)[i];
|
char *mac = (*macs)[i];
|
||||||
|
Loading…
Reference in New Issue
Block a user