LKML Archive on lore.kernel.org
help / color / mirror / Atom feed
From: James Clark <james.clark@arm.com>
To: Jiri Olsa <jolsa@redhat.com>
Cc: acme@kernel.org, john.garry@huawei.com, ak@linux.intel.com,
linux-perf-users@vger.kernel.org, Nick.Forrington@arm.com,
Andrew.Kilroy@arm.com, Will Deacon <will@kernel.org>,
Mathieu Poirier <mathieu.poirier@linaro.org>,
Leo Yan <leo.yan@linaro.org>, Mark Rutland <mark.rutland@arm.com>,
Alexander Shishkin <alexander.shishkin@linux.intel.com>,
Namhyung Kim <namhyung@kernel.org>,
linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH 2/3] perf tools: Make the JSON parser more conformant when in strict mode
Date: Fri, 8 Oct 2021 11:08:25 +0100 [thread overview]
Message-ID: <2e14963b-cb98-f508-7067-255fdbd36bdb@arm.com> (raw)
In-Reply-To: <YV8z306sBJQsdNNR@krava>
On 07/10/2021 18:52, Jiri Olsa wrote:
> On Thu, Oct 07, 2021 at 12:05:41PM +0100, James Clark wrote:
>> Return an error when a trailing comma is found or a new item is
>> encountered before a comma or an opening brace. This ensures that the
>> perf json files conform more closely to the spec at https://www.json.org
>>
>> Signed-off-by: James Clark <james.clark@arm.com>
>> ---
>> tools/perf/pmu-events/jsmn.c | 42 ++++++++++++++++++++++++++++++++++--
>> 1 file changed, 40 insertions(+), 2 deletions(-)
>>
>> diff --git a/tools/perf/pmu-events/jsmn.c b/tools/perf/pmu-events/jsmn.c
>> index 11d1fa18bfa5..8124d2d3ff0c 100644
>> --- a/tools/perf/pmu-events/jsmn.c
>> +++ b/tools/perf/pmu-events/jsmn.c
>> @@ -176,6 +176,14 @@ jsmnerr_t jsmn_parse(jsmn_parser *parser, const char *js, size_t len,
>> jsmnerr_t r;
>> int i;
>> jsmntok_t *token;
>> +#ifdef JSMN_STRICT
>
> I might have missed some discussion on this, but do we need the
> JSMN_STRICT define, if you enable it in the next patch?
> why can't we be more strict by default.. do you plan to disable
> it in future?
I didn't plan on disabling it, I was just trying to keep to the existing style of the
jsmn project.
I could have added the trailing comma detection by default and not inside any
#ifdef JSMN_STRICT blocks, but I would like to enable JSMN_STRICT anyway, because it
enables some additional built in checking that was already there. So I thought it
made sense to put my new strict stuff inside the existing strict option.
One option would be to remove all (including the existing) #ifdef JSMN_STRICT blocks
and have everything strict by default. But it would be a further deviation from jsmn.
Thanks
James
>
> thanks,
> jirka
>
>> + /*
>> + * Keeps track of whether a new object/list/primitive is expected. New items are only
>> + * allowed after an opening brace, comma or colon. A closing brace after a comma is not
>> + * valid JSON.
>> + */
>> + int expecting_item = 1;
>> +#endif
>>
>> for (; parser->pos < len; parser->pos++) {
>> char c;
>> @@ -185,6 +193,10 @@ jsmnerr_t jsmn_parse(jsmn_parser *parser, const char *js, size_t len,
>> switch (c) {
>> case '{':
>> case '[':
>> +#ifdef JSMN_STRICT
>> + if (!expecting_item)
>> + return JSMN_ERROR_INVAL;
>> +#endif
>> token = jsmn_alloc_token(parser, tokens, num_tokens);
>> if (token == NULL)
>> return JSMN_ERROR_NOMEM;
>> @@ -196,6 +208,10 @@ jsmnerr_t jsmn_parse(jsmn_parser *parser, const char *js, size_t len,
>> break;
>> case '}':
>> case ']':
>> +#ifdef JSMN_STRICT
>> + if (expecting_item)
>> + return JSMN_ERROR_INVAL;
>> +#endif
>> type = (c == '}' ? JSMN_OBJECT : JSMN_ARRAY);
>> for (i = parser->toknext - 1; i >= 0; i--) {
>> token = &tokens[i];
>> @@ -219,6 +235,11 @@ jsmnerr_t jsmn_parse(jsmn_parser *parser, const char *js, size_t len,
>> }
>> break;
>> case '\"':
>> +#ifdef JSMN_STRICT
>> + if (!expecting_item)
>> + return JSMN_ERROR_INVAL;
>> + expecting_item = 0;
>> +#endif
>> r = jsmn_parse_string(parser, js, len, tokens,
>> num_tokens);
>> if (r < 0)
>> @@ -229,11 +250,15 @@ jsmnerr_t jsmn_parse(jsmn_parser *parser, const char *js, size_t len,
>> case '\t':
>> case '\r':
>> case '\n':
>> - case ':':
>> - case ',':
>> case ' ':
>> break;
>> #ifdef JSMN_STRICT
>> + case ':':
>> + case ',':
>> + if (expecting_item)
>> + return JSMN_ERROR_INVAL;
>> + expecting_item = 1;
>> + break;
>> /*
>> * In strict mode primitives are:
>> * numbers and booleans.
>> @@ -253,6 +278,9 @@ jsmnerr_t jsmn_parse(jsmn_parser *parser, const char *js, size_t len,
>> case 'f':
>> case 'n':
>> #else
>> + case ':':
>> + case ',':
>> + break;
>> /*
>> * In non-strict mode every unquoted value
>> * is a primitive.
>> @@ -260,6 +288,12 @@ jsmnerr_t jsmn_parse(jsmn_parser *parser, const char *js, size_t len,
>> /*FALL THROUGH */
>> default:
>> #endif
>> +
>> +#ifdef JSMN_STRICT
>> + if (!expecting_item)
>> + return JSMN_ERROR_INVAL;
>> + expecting_item = 0;
>> +#endif
>> r = jsmn_parse_primitive(parser, js, len, tokens,
>> num_tokens);
>> if (r < 0)
>> @@ -282,7 +316,11 @@ jsmnerr_t jsmn_parse(jsmn_parser *parser, const char *js, size_t len,
>> return JSMN_ERROR_PART;
>> }
>>
>> +#ifdef JSMN_STRICT
>> + return expecting_item ? JSMN_ERROR_INVAL : JSMN_SUCCESS;
>> +#else
>> return JSMN_SUCCESS;
>> +#endif
>> }
>>
>> /*
>> --
>> 2.28.0
>>
>
next prev parent reply other threads:[~2021-10-08 10:08 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-10-07 11:05 [PATCH 0/3] perf tools: Enable strict JSON parsing James Clark
2021-10-07 11:05 ` [PATCH 1/3] perf vendor-events: Fix all remaining invalid JSON files James Clark
2021-10-07 17:22 ` John Garry
2021-10-07 11:05 ` [PATCH 2/3] perf tools: Make the JSON parser more conformant when in strict mode James Clark
2021-10-07 17:52 ` Jiri Olsa
2021-10-08 10:08 ` James Clark [this message]
2021-10-08 13:12 ` Jiri Olsa
2021-10-08 18:56 ` Arnaldo Carvalho de Melo
2021-10-08 19:01 ` Arnaldo Carvalho de Melo
2021-10-07 11:05 ` [PATCH 3/3] perf tools: Enable strict JSON parsing James Clark
2021-10-07 23:51 ` [PATCH 0/3] " Andi Kleen
2021-10-08 7:43 ` kajoljain
2021-10-08 10:02 ` James Clark
2021-10-08 11:26 ` kajoljain
2021-10-08 19:00 ` Arnaldo Carvalho de Melo
2021-10-12 13:30 ` James Clark
2021-10-12 20:15 ` Arnaldo Carvalho de Melo
2021-10-13 16:57 ` Arnaldo Carvalho de Melo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=2e14963b-cb98-f508-7067-255fdbd36bdb@arm.com \
--to=james.clark@arm.com \
--cc=Andrew.Kilroy@arm.com \
--cc=Nick.Forrington@arm.com \
--cc=acme@kernel.org \
--cc=ak@linux.intel.com \
--cc=alexander.shishkin@linux.intel.com \
--cc=john.garry@huawei.com \
--cc=jolsa@redhat.com \
--cc=leo.yan@linaro.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=mathieu.poirier@linaro.org \
--cc=namhyung@kernel.org \
--cc=will@kernel.org \
--subject='Re: [PATCH 2/3] perf tools: Make the JSON parser more conformant when in strict mode' \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).