summaryrefslogtreecommitdiff
path: root/json.c
diff options
context:
space:
mode:
authorEric S. Raymond <esr@thyrsus.com>2009-11-11 05:51:48 +0000
committerEric S. Raymond <esr@thyrsus.com>2009-11-11 05:51:48 +0000
commit936d330fa8653001600020755844509e26cf874f (patch)
tree8b3c3c3e46390c39388bb7e602173262d3c3be4d /json.c
parent65f9e5cc8fcdb18b1bd3d49b96b67c9aa43f47ca (diff)
downloadgpsd-936d330fa8653001600020755844509e26cf874f.tar.gz
Add post_array state to the JSON parser, fixes an error in device-list parsing.
Diffstat (limited to 'json.c')
-rw-r--r--json.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/json.c b/json.c
index 022d2ffb..a6279943 100644
--- a/json.c
+++ b/json.c
@@ -100,12 +100,12 @@ static int json_internal_read_object(const char *cp,
/*@null@*/const char **end)
{
/*@ -nullstate -nullderef -mustfreefresh -nullpass -usedef @*/
- enum {init, await_attr, in_attr, await_value,
- in_val_string, in_escape, in_val_token, post_val} state = 0;
+ enum {init, await_attr, in_attr, await_value, in_val_string,
+ in_escape, in_val_token, post_val, post_array} state = 0;
#ifdef JSONDEBUG
char *statenames[] = {
- "init", "await_attr", "in_attr", "await_value",
- "in_val_string", "in_escape", "in_val_token", "post_val"
+ "init", "await_attr", "in_attr", "await_value", "in_val_string",
+ "in_escape", "in_val_token", "post_val", "post_array",
};
#endif /* JSONDEBUG */
char attrbuf[JSON_ATTR_MAX+1], *pattr = NULL;
@@ -231,7 +231,7 @@ static int json_internal_read_object(const char *cp,
substatus = json_read_array(cp, &cursor->addr.array, &cp);
if (substatus != 0)
return substatus;
- state = post_val;
+ state = post_array;
} else if (cursor->type == array) {
json_debug_trace(("Array element was specified, but no [.\n"));
return JSON_ERR_NOBRAK;
@@ -358,6 +358,8 @@ static int json_internal_read_object(const char *cp,
}
break;
}
+ /* FALL THROUGH */
+ case post_array:
if (isspace(*cp))
continue;
else if (*cp == ',')