]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
JSON: Fix parsing of arrays of numbers, strings, literals
authorJouni Malinen <jouni@qca.qualcomm.com>
Tue, 22 Aug 2017 21:28:55 +0000 (00:28 +0300)
committerJouni Malinen <j@w1.fi>
Tue, 22 Aug 2017 21:28:55 +0000 (00:28 +0300)
The previous implementation was able to parse arrays of objects, but not
arrays of other types of items.

Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
src/utils/json.c

index c544b99180d29b76e34cdd86cffa25f0d6640b38..eae627d87dd0b72d9dbbcedaee73c2f3ef7d4774 100644 (file)
@@ -296,6 +296,16 @@ struct json_token * json_parse(const char *data, size_t data_len)
                                token->type = JSON_STRING;
                                token->string = str;
                                token->state = JSON_COMPLETED;
+                       } else if (curr_token->parent &&
+                                  curr_token->parent->type == JSON_ARRAY &&
+                                  curr_token->parent->state == JSON_STARTED &&
+                                  curr_token->state == JSON_EMPTY) {
+                               curr_token->string = str;
+                               curr_token->state = JSON_COMPLETED;
+                               curr_token->type = JSON_STRING;
+                               wpa_printf(MSG_MSGDUMP,
+                                          "JSON: String value: '%s'",
+                                          curr_token->string);
                        } else if (curr_token->state == JSON_EMPTY) {
                                curr_token->type = JSON_VALUE;
                                curr_token->name = str;
@@ -358,6 +368,12 @@ struct json_token * json_parse(const char *data, size_t data_len)
                                wpa_printf(MSG_MSGDUMP,
                                           "JSON: Literal name: '%s' = %c",
                                           curr_token->name, *pos);
+                       } else if (curr_token->parent &&
+                                  curr_token->parent->type == JSON_ARRAY &&
+                                  curr_token->parent->state == JSON_STARTED &&
+                                  curr_token->state == JSON_EMPTY) {
+                               wpa_printf(MSG_MSGDUMP,
+                                          "JSON: Literal name: %c", *pos);
                        } else {
                                wpa_printf(MSG_DEBUG,
                                           "JSON: Invalid state for a literal name");
@@ -410,6 +426,16 @@ struct json_token * json_parse(const char *data, size_t data_len)
                                           "JSON: Number value: '%s' = '%d'",
                                           curr_token->name,
                                           curr_token->number);
+                       } else if (curr_token->parent &&
+                                  curr_token->parent->type == JSON_ARRAY &&
+                                  curr_token->parent->state == JSON_STARTED &&
+                                  curr_token->state == JSON_EMPTY) {
+                               curr_token->number = num;
+                               curr_token->state = JSON_COMPLETED;
+                               curr_token->type = JSON_NUMBER;
+                               wpa_printf(MSG_MSGDUMP,
+                                          "JSON: Number value: %d",
+                                          curr_token->number);
                        } else {
                                wpa_printf(MSG_DEBUG,
                                           "JSON: Invalid state for a number");