All of lore.kernel.org
 help / color / mirror / Atom feed
From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Jiri Olsa <jolsa@redhat.com>
Cc: James Clark <james.clark@arm.com>,
	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:56:26 -0300	[thread overview]
Message-ID: <YWCUWo6pMns6p05o@kernel.org> (raw)
In-Reply-To: <YWBDo5Ciq1hOIxLq@krava>

Em Fri, Oct 08, 2021 at 03:12:03PM +0200, Jiri Olsa escreveu:
> 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>

So, is this for the whole patchset? b4 picked it just for this message.

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

-- 

- Arnaldo

WARNING: multiple messages have this Message-ID (diff)
From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Jiri Olsa <jolsa@redhat.com>
Cc: James Clark <james.clark@arm.com>,
	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:56:26 -0300	[thread overview]
Message-ID: <YWCUWo6pMns6p05o@kernel.org> (raw)
In-Reply-To: <YWBDo5Ciq1hOIxLq@krava>

Em Fri, Oct 08, 2021 at 03:12:03PM +0200, Jiri Olsa escreveu:
> 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>

So, is this for the whole patchset? b4 picked it just for this message.

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

-- 

- Arnaldo

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  reply	other threads:[~2021-10-08 18:56 UTC|newest]

Thread overview: 36+ 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 ` James Clark
2021-10-07 11:05 ` [PATCH 1/3] perf vendor-events: Fix all remaining invalid JSON files James Clark
2021-10-07 11:05   ` James Clark
2021-10-07 17:22   ` John Garry
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 11:05   ` James Clark
2021-10-07 17:52   ` Jiri Olsa
2021-10-07 17:52     ` Jiri Olsa
2021-10-08 10:08     ` James Clark
2021-10-08 10:08       ` James Clark
2021-10-08 13:12       ` Jiri Olsa
2021-10-08 13:12         ` Jiri Olsa
2021-10-08 18:56         ` Arnaldo Carvalho de Melo [this message]
2021-10-08 18:56           ` Arnaldo Carvalho de Melo
2021-10-08 19:01           ` 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 11:05   ` James Clark
2021-10-07 23:51 ` [PATCH 0/3] " Andi Kleen
2021-10-07 23:51   ` Andi Kleen
2021-10-08  7:43 ` kajoljain
2021-10-08  7:43   ` kajoljain
2021-10-08 10:02   ` James Clark
2021-10-08 10:02     ` James Clark
2021-10-08 11:26     ` kajoljain
2021-10-08 11:26       ` kajoljain
2021-10-08 19:00       ` Arnaldo Carvalho de Melo
2021-10-08 19:00         ` Arnaldo Carvalho de Melo
2021-10-12 13:30         ` James Clark
2021-10-12 13:30           ` James Clark
2021-10-12 20:15           ` Arnaldo Carvalho de Melo
2021-10-12 20:15             ` Arnaldo Carvalho de Melo
2021-10-13 16:57           ` 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=YWCUWo6pMns6p05o@kernel.org \
    --to=acme@kernel.org \
    --cc=Andrew.Kilroy@arm.com \
    --cc=Nick.Forrington@arm.com \
    --cc=ak@linux.intel.com \
    --cc=alexander.shishkin@linux.intel.com \
    --cc=james.clark@arm.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 \
    /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
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.