Change max json area length type to unsigned.

We use uint64_t for max json length everywhere else
including config.json_size field in LUKS2 metadata.

Also renames some misleading parameter names.
This commit is contained in:
Ondrej Kozina
2018-11-21 10:26:28 +01:00
committed by Milan Broz
parent e7141383e3
commit bcd7527938
2 changed files with 18 additions and 17 deletions

View File

@@ -26,12 +26,13 @@
/* /*
* Helper functions * Helper functions
*/ */
json_object *parse_json_len(const char *json_area, int length, int *end_offset) json_object *parse_json_len(const char *json_area, uint64_t max_length, int *json_len)
{ {
json_object *jobj; json_object *jobj;
struct json_tokener *jtok; struct json_tokener *jtok;
if (!json_area || length <= 0) /* INT32_MAX is internal (json-c) json_tokener_parse_ex() limit */
if (!json_area || max_length > INT32_MAX)
return NULL; return NULL;
jtok = json_tokener_new(); jtok = json_tokener_new();
@@ -40,13 +41,13 @@ json_object *parse_json_len(const char *json_area, int length, int *end_offset)
return NULL; return NULL;
} }
jobj = json_tokener_parse_ex(jtok, json_area, length); jobj = json_tokener_parse_ex(jtok, json_area, max_length);
if (!jobj) if (!jobj)
log_dbg("ERROR: Failed to parse json data (%d): %s", log_dbg("ERROR: Failed to parse json data (%d): %s",
json_tokener_get_error(jtok), json_tokener_get_error(jtok),
json_tokener_error_desc(json_tokener_get_error(jtok))); json_tokener_error_desc(json_tokener_get_error(jtok)));
else else
*end_offset = jtok->char_offset; *json_len = jtok->char_offset;
json_tokener_free(jtok); json_tokener_free(jtok);
@@ -444,7 +445,7 @@ int LUKS2_disk_hdr_write(struct crypt_device *cd, struct luks2_hdr *hdr, struct
return r; return r;
} }
static int validate_json_area(const char *json_area, int start, int length) static int validate_json_area(const char *json_area, uint64_t json_len, uint64_t max_length)
{ {
char c; char c;
@@ -454,7 +455,7 @@ static int validate_json_area(const char *json_area, int start, int length)
return -EINVAL; return -EINVAL;
} }
if (start >= length) { if (json_len >= max_length) {
log_dbg("ERROR: Missing trailing null byte beyond parsed json data string."); log_dbg("ERROR: Missing trailing null byte beyond parsed json data string.");
return -EINVAL; return -EINVAL;
} }
@@ -462,17 +463,17 @@ static int validate_json_area(const char *json_area, int start, int length)
/* /*
* TODO: * TODO:
* validate there are legal json format characters between * validate there are legal json format characters between
* 'json_area' and 'json_area + start' * 'json_area' and 'json_area + json_len'
*/ */
do { do {
c = *(json_area + start); c = *(json_area + json_len);
if (c != '\0') { if (c != '\0') {
log_dbg("ERROR: Forbidden ascii code 0x%02hhx found beyond json data string at offset %d.", log_dbg("ERROR: Forbidden ascii code 0x%02hhx found beyond json data string at offset %" PRIu64,
c, start); c, json_len);
return -EINVAL; return -EINVAL;
} }
} while (++start < length); } while (++json_len < max_length);
return 0; return 0;
} }
@@ -504,18 +505,18 @@ static int validate_luks2_json_object(json_object *jobj_hdr)
return r; return r;
} }
static json_object *parse_and_validate_json(const char *json_area, int length) static json_object *parse_and_validate_json(const char *json_area, uint64_t max_length)
{ {
int offset, r; int json_len, r;
json_object *jobj = parse_json_len(json_area, length, &offset); json_object *jobj = parse_json_len(json_area, max_length, &json_len);
if (!jobj) if (!jobj)
return NULL; return NULL;
/* successful parse_json_len must not return offset <= 0 */ /* successful parse_json_len must not return offset <= 0 */
assert(offset > 0); assert(json_len > 0);
r = validate_json_area(json_area, offset, length); r = validate_json_area(json_area, json_len, max_length);
if (!r) if (!r)
r = validate_luks2_json_object(jobj); r = validate_luks2_json_object(jobj);

View File

@@ -58,7 +58,7 @@ json_object *LUKS2_get_tokens_jobj(struct luks2_hdr *hdr);
void hexprint_base64(struct crypt_device *cd, json_object *jobj, void hexprint_base64(struct crypt_device *cd, json_object *jobj,
const char *sep, const char *line_sep); const char *sep, const char *line_sep);
json_object *parse_json_len(const char *json_area, int length, int *end_offset); json_object *parse_json_len(const char *json_area, uint64_t max_length, int *json_len);
uint64_t json_object_get_uint64(json_object *jobj); uint64_t json_object_get_uint64(json_object *jobj);
uint32_t json_object_get_uint32(json_object *jobj); uint32_t json_object_get_uint32(json_object *jobj);
json_object *json_object_new_uint64(uint64_t value); json_object *json_object_new_uint64(uint64_t value);