All of lore.kernel.org
 help / color / mirror / Atom feed
From: Cyril Hrubis <chrubis@suse.cz>
To: ltp@lists.linux.it
Subject: [LTP] [PATCH 1/1] docparse: Escape backslash, tab and double quote in JSON
Date: Mon, 3 May 2021 13:51:04 +0200	[thread overview]
Message-ID: <YI/jqKdP7kRYK1qD@yuki> (raw)
In-Reply-To: <20210503085732.9637-1-pvorel@suse.cz>

Hi!
> not sure if I should escape more, e.g.:
> \b  Backspace (ascii code 08)
> \f  Form feed (ascii code 0C)
> \n  New line
> \r  Carriage return
> 
> Tested on Richard's BPF patchset [1], which got affected on " + previous
> problems on CAN tests, which contained \t in testcases/network/can/filter-tests/can_filter.c
> (i.e. with reverted 1cdf8ce8b).
> 
> Kind regards,
> Petr
> 
> [1] https://patchwork.ozlabs.org/project/ltp/list/?series=240772&state=*
> [2] https://patchwork.ozlabs.org/project/ltp/patch/20210426120107.6632-2-rpalethorpe@suse.com/
> 
>  docparse/data_storage.h | 36 ++++++++++++++++++++++++++++++++++--
>  1 file changed, 34 insertions(+), 2 deletions(-)
> 
> diff --git a/docparse/data_storage.h b/docparse/data_storage.h
> index ef420c08f..08cdc009d 100644
> --- a/docparse/data_storage.h
> +++ b/docparse/data_storage.h
> @@ -256,14 +256,46 @@ static inline void data_fprintf(FILE *f, unsigned int padd, const char *fmt, ...
>  	va_end(va);
>  }
>  
> -static inline void data_to_json_(struct data_node *self, FILE *f, unsigned int padd, int do_padd)
> +static inline void json_escape_(char str[], char search, char replace[])
> +{
> +	char *tmp;
> +	char *p = str;
> +	size_t i, str_len, tmp_len, replace_len, shift;
> +
> +	while ((tmp = strchr(p, search))) {
> +		str_len = strlen(str);
> +		tmp_len = strlen(tmp);
> +		replace_len = strlen(replace);
> +		shift = str_len - tmp_len;
> +
> +		memmove(str + shift + replace_len - 1, str + shift, tmp_len);
> +
> +		for (i = 0; i < replace_len; i++)
> +			str[shift++] = replace[i];
> +
> +		str[str_len + replace_len - 1] = '\0';
> +		p = tmp + replace_len;
> +	}
> +}
> +
> +static inline const char *json_escape(char *input)
> +{
> +	json_escape_(input, '\\', "\\\\");
> +	json_escape_(input, '"', "\\\"");
> +	json_escape_(input, '\t', "\\t");
> +
> +	return input;
> +}

I guess that it would be easier to write a function to print json
string, e.g.

static inline void data_fprintf_esc_(FILE *f, unsigned int padd, const char *str)
{
	while (padd-- > 0)
		fputc(' ', f);

	fputc('"', f);

	while (*str) {
		switch (*str) {
		case '\\':
			fputs("\\\\", f);
		break;
		case '"':
			fputs("\\\"", f);
		break;
		case '\t':
			fputs("\\t", f);
		break;
		default:
			putc(*str, f);
		break;
		}
		str++;
	}

	fputc('"', f);
}

> +static inline void data_to_json_(struct data_node *self, FILE *f, unsigned int
> +				 padd, int do_padd)
>  {
>  	unsigned int i;
>  
>  	switch (self->type) {
>  	case DATA_STRING:
>  		padd = do_padd ? padd : 0;
> -		data_fprintf(f, padd, "\"%s\"", self->string.val);
> +		data_fprintf(f, padd, "\"%s\"", json_escape((self->string.val)));
>  	break;
>  	case DATA_HASH:
>  		for (i = 0; i < self->hash.elems_used; i++) {
> -- 
> 2.31.1
> 

-- 
Cyril Hrubis
chrubis@suse.cz

  reply	other threads:[~2021-05-03 11:51 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-05-03  8:57 [LTP] [PATCH 1/1] docparse: Escape backslash, tab and double quote in JSON Petr Vorel
2021-05-03 11:51 ` Cyril Hrubis [this message]
2021-05-03 12:38   ` Petr Vorel

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=YI/jqKdP7kRYK1qD@yuki \
    --to=chrubis@suse.cz \
    --cc=ltp@lists.linux.it \
    /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.