From: Daniel Wagner Date: Fri, 30 Sep 2022 10:10:04 +0000 (+0200) Subject: json: Enforce correctly formatted JSON config files X-Git-Tag: v1.2~16^2~1 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=8f5d708157fd16bf6008fe9ebd1890cc541c35cf;p=users%2Fsagi%2Flibnvme.git json: Enforce correctly formatted JSON config files json-c's json_object_from_fd() doesn't set the JSON_TOKENER_STRICT flag. This means the parser is more failure tolerant. Let's be strict and enforce fully correctly formatted configuration. Signed-off-by: Daniel Wagner --- diff --git a/src/nvme/json.c b/src/nvme/json.c index 36dab6a4..38ac1be2 100644 --- a/src/nvme/json.c +++ b/src/nvme/json.c @@ -158,6 +158,43 @@ static void json_parse_host(nvme_root_t r, struct json_object *host_obj) } } +static struct json_object *parse_json(nvme_root_t r, int fd) +{ + char buf[JSON_FILE_BUF_SIZE]; + struct json_object *obj = NULL; + struct printbuf *pb; + json_tokener *tok = NULL; + int ret; + + pb = printbuf_new(); + if (!pb) + return NULL; + + while ((ret = read(fd, buf, JSON_FILE_BUF_SIZE)) > 0) + printbuf_memappend(pb, buf, ret); + + if (ret < 0) + goto out; + + tok = json_tokener_new_ex(JSON_TOKENER_DEFAULT_DEPTH); + if (!tok) + goto out; + + /* Enforce correctly formatted JSON */ + tok->flags = JSON_TOKENER_STRICT; + + obj = json_tokener_parse_ex(tok, pb->buf, printbuf_length(pb)); + if (!obj) + nvme_msg(r, LOG_DEBUG, "JSON parsing failed: %s\n", + json_util_get_last_err()); +out: + if (tok) + json_tokener_free(tok); + printbuf_free(pb); + + return obj; +} + int json_read_config(nvme_root_t r, const char *config_file) { struct json_object *json_root, *host_obj; @@ -169,10 +206,8 @@ int json_read_config(nvme_root_t r, const char *config_file) config_file, strerror(errno)); return fd; } - json_root = json_object_from_fd(fd); + json_root = parse_json(r, fd); if (!json_root) { - nvme_msg(r, LOG_DEBUG, "Failed to read %s, %s\n", - config_file, json_util_get_last_err()); errno = EPROTO; close(fd); return -1;