LKML Archive on lore.kernel.org
help / color / mirror / Atom feed
From: Jiri Olsa <jolsa@redhat.com>
To: James Clark <james.clark@arm.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 15:12:03 +0200	[thread overview]
Message-ID: <YWBDo5Ciq1hOIxLq@krava> (raw)
In-Reply-To: <2e14963b-cb98-f508-7067-255fdbd36bdb@arm.com>

On Fri, Oct 08, 2021 at 11:08:25AM +0100, James Clark wrote:
> 
> 
> 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.

ok, I think it makes sense to have JSMN_STRICT then..
thanks for explanation

Acked-by: Jiri Olsa <jolsa@redhat.com>

jirka

> 
> 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
> >>
> > 
> 


  reply	other threads:[~2021-10-08 13:12 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
2021-10-08 13:12       ` Jiri Olsa [this message]
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=YWBDo5Ciq1hOIxLq@krava \
    --to=jolsa@redhat.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=james.clark@arm.com \
    --cc=john.garry@huawei.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).