All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
To: "J. Bruce Fields" <bfields@redhat.com>,
	Andy Shevchenko <andriy.shevchenko@linux.intel.com>,
	linux-kernel@vger.kernel.org, linux-nfs@vger.kernel.org,
	linux-fsdevel@vger.kernel.org
Cc: "J. Bruce Fields" <bfields@fieldses.org>,
	Chuck Lever <chuck.lever@oracle.com>,
	Alexander Viro <viro@zeniv.linux.org.uk>,
	Andy Shevchenko <andy@kernel.org>,
	Andrew Morton <akpm@linux-foundation.org>
Subject: [PATCH v3 06/15] lib/string_helpers: Allow to append additional characters to be escaped
Date: Tue,  4 May 2021 21:08:10 +0300	[thread overview]
Message-ID: <20210504180819.73127-7-andriy.shevchenko@linux.intel.com> (raw)
In-Reply-To: <20210504180819.73127-1-andriy.shevchenko@linux.intel.com>

Introduce a new flag to append additional characters, passed in 'only'
parameter, to be escaped if they fall in the corresponding class.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 include/linux/string_helpers.h |  1 +
 lib/string_helpers.c           | 19 +++++++++++++++----
 2 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/include/linux/string_helpers.h b/include/linux/string_helpers.h
index 811c6a627620..f8728ed4d563 100644
--- a/include/linux/string_helpers.h
+++ b/include/linux/string_helpers.h
@@ -54,6 +54,7 @@ static inline int string_unescape_any_inplace(char *buf)
 #define ESCAPE_HEX		BIT(5)
 #define ESCAPE_NA		BIT(6)
 #define ESCAPE_NAP		BIT(7)
+#define ESCAPE_APPEND		BIT(8)
 
 int string_escape_mem(const char *src, size_t isz, char *dst, size_t osz,
 		unsigned int flags, const char *only);
diff --git a/lib/string_helpers.c b/lib/string_helpers.c
index ceca5fbbd92c..c15aea7a82e9 100644
--- a/lib/string_helpers.c
+++ b/lib/string_helpers.c
@@ -493,6 +493,11 @@ static bool escape_hex(unsigned char c, char **dst, char *end)
  *		escape only non-ascii characters, checked by isascii()
  *	%ESCAPE_NAP:
  *		escape only non-printable or non-ascii characters
+ *	%ESCAPE_APPEND:
+ *		append characters from @only to be escaped by the given classes
+ *
+ * %ESCAPE_APPEND would help to pass additional characters to the escaped, when
+ * one of %ESCAPE_NP, %ESCAPE_NA, or %ESCAPE_NAP is provided.
  *
  * One notable caveat, the %ESCAPE_NAP, %ESCAPE_NP and %ESCAPE_NA have the
  * higher priority than the rest of the flags (%ESCAPE_NAP is the highest).
@@ -513,9 +518,11 @@ int string_escape_mem(const char *src, size_t isz, char *dst, size_t osz,
 	char *p = dst;
 	char *end = p + osz;
 	bool is_dict = only && *only;
+	bool is_append = flags & ESCAPE_APPEND;
 
 	while (isz--) {
 		unsigned char c = *src++;
+		bool in_dict = is_dict && strchr(only, c);
 
 		/*
 		 * Apply rules in the following sequence:
@@ -531,20 +538,24 @@ int string_escape_mem(const char *src, size_t isz, char *dst, size_t osz,
 		 *	  defined by given @flags
 		 * In these cases we just pass through a character to the
 		 * output buffer.
+		 *
+		 * When %ESCAPE_APPEND is passed, the characters from @only
+		 * have been excluded from the %ESCAPE_NAP, %ESCAPE_NP, and
+		 * %ESCAPE_NA cases.
 		 */
-		if (is_dict && !strchr(only, c) &&
+		if (!(is_append || in_dict) && is_dict &&
 					  escape_passthrough(c, &p, end))
 			continue;
 
-		if (isascii(c) && isprint(c) &&
+		if (!(is_append && in_dict) && isascii(c) && isprint(c) &&
 		    flags & ESCAPE_NAP && escape_passthrough(c, &p, end))
 			continue;
 
-		if (isprint(c) &&
+		if (!(is_append && in_dict) && isprint(c) &&
 		    flags & ESCAPE_NP && escape_passthrough(c, &p, end))
 			continue;
 
-		if (isascii(c) &&
+		if (!(is_append && in_dict) && isascii(c) &&
 		    flags & ESCAPE_NA && escape_passthrough(c, &p, end))
 			continue;
 
-- 
2.30.2


  parent reply	other threads:[~2021-05-04 18:10 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-05-04 18:08 [PATCH v3 00/15] lib/string_helpers: get rid of ugly *_escape_mem_ascii() Andy Shevchenko
2021-05-04 18:08 ` [PATCH v3 01/15] lib/string_helpers: Switch to use BIT() macro Andy Shevchenko
2021-05-04 18:08 ` [PATCH v3 02/15] lib/string_helpers: Move ESCAPE_NP check inside 'else' branch in a loop Andy Shevchenko
2021-05-04 18:08 ` [PATCH v3 03/15] lib/string_helpers: Drop indentation level in string_escape_mem() Andy Shevchenko
2021-05-04 18:08 ` [PATCH v3 04/15] lib/string_helpers: Introduce ESCAPE_NA for escaping non-ASCII Andy Shevchenko
2021-05-04 18:08 ` [PATCH v3 05/15] lib/string_helpers: Introduce ESCAPE_NAP to escape non-ASCII and non-printable Andy Shevchenko
2021-05-04 18:08 ` Andy Shevchenko [this message]
2021-05-04 18:08 ` [PATCH v3 07/15] lib/test-string_helpers: Print flags in hexadecimal format Andy Shevchenko
2021-05-04 18:08 ` [PATCH v3 08/15] lib/test-string_helpers: Get rid of trailing comma in terminators Andy Shevchenko
2021-05-04 18:08 ` [PATCH v3 09/15] lib/test-string_helpers: Add test cases for new features Andy Shevchenko
2021-05-04 18:08 ` [PATCH v3 10/15] MAINTAINERS: Add myself as designated reviewer for generic string library Andy Shevchenko
2021-05-12  6:20   ` Joe Perches
2021-05-04 18:08 ` [PATCH v3 11/15] seq_file: Introduce seq_escape_mem() Andy Shevchenko
2021-05-04 18:08 ` [PATCH v3 12/15] seq_file: Add seq_escape_str() as replica of string_escape_str() Andy Shevchenko
2021-05-04 18:08 ` [PATCH v3 13/15] seq_file: Convert seq_escape() to use seq_escape_str() Andy Shevchenko
2021-05-04 18:08 ` [PATCH v3 14/15] nfsd: Avoid non-flexible API in seq_quote_mem() Andy Shevchenko
2021-05-04 18:08 ` [PATCH v3 15/15] seq_file: Drop unused *_escape_mem_ascii() Andy Shevchenko
2021-05-11 18:57 ` [PATCH v3 00/15] lib/string_helpers: get rid of ugly *_escape_mem_ascii() J. Bruce Fields

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=20210504180819.73127-7-andriy.shevchenko@linux.intel.com \
    --to=andriy.shevchenko@linux.intel.com \
    --cc=akpm@linux-foundation.org \
    --cc=andy@kernel.org \
    --cc=bfields@fieldses.org \
    --cc=bfields@redhat.com \
    --cc=chuck.lever@oracle.com \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-nfs@vger.kernel.org \
    --cc=viro@zeniv.linux.org.uk \
    /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.