Received: by 2002:a25:ab43:0:0:0:0:0 with SMTP id u61csp2020775ybi; Thu, 20 Jun 2019 07:52:06 -0700 (PDT) X-Google-Smtp-Source: APXvYqwm/mMIYkP2eKVoA0rhIIse34ViAxXO9uFqQUdXQ/h+C5mbP1SySEt1N6QKeQaMuoyInTtk X-Received: by 2002:a17:902:bd0a:: with SMTP id p10mr50044197pls.134.1561042326648; Thu, 20 Jun 2019 07:52:06 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1561042326; cv=none; d=google.com; s=arc-20160816; b=FVJjUE8+N+p7oItzvv8gJTK/qldUAHft9FZ8qiEUebUwhVf46EHLkKa4PHkS9GTEEq Tw1GezwazU21GQyv6/mWnPa/kUnfbAMhkSvyi+Z6sCBvU9ZeypeK1GU6oAjfJ2mgyMOD XURHuupioABYeJBelDGk7vysbcno9Cx269KFsgqxHMaVcoxeZn8e/mQdwhh5Bnu7QFv8 eX9451utXUT7JzAaQ1/CqEjNEL7FXD99aXgup/4V2mUE2xWdp3c5tAMjRqnYoc1mwBEd 9ZcK8q9xvkV5skRQ34WnwfpHMH+Ty2rRQmkSquNzXZ5hn59yOGpsXygVERlhtJ/x7IkT D1Nw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from; bh=IJYFH6LaSYvD+RLWa+C2V0lZyfBFs5BNjFWlcqtyxQs=; b=aDlZagnY80DHLyweZrFqPRi3L5be82PC5GZges9Tq3R007xFYRRNrwcQcEb1i3aHug jZHGIHj5CUHvb64eL2VxIChdOeJansCV5VmspvpAnzP33uCuNky3zie+JUXqUavFIb4p lhMUtQVjGROyYDYrj5cdz2R20OidExK7FlQgf/DJaLx+6hc1W37pO8vI5yVnRjqQhj2P Mc3KXmFMMtwLy+IIu47GtybA9IDR2uoWxYIgYES8hFeHuXxELbHNVPZKodAnPE5s1u3+ 2jqe4BCd5n9J1svciCOr7nAB07vcYccGg8uTpcgztazwym19EoLgPQZwOgjJaQh7LdWb zxhg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-nfs-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-nfs-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id d10si17766382plr.307.2019.06.20.07.51.52; Thu, 20 Jun 2019 07:52:06 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-nfs-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-nfs-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-nfs-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726740AbfFTOv1 (ORCPT + 99 others); Thu, 20 Jun 2019 10:51:27 -0400 Received: from fieldses.org ([173.255.197.46]:43458 "EHLO fieldses.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726866AbfFTOvV (ORCPT ); Thu, 20 Jun 2019 10:51:21 -0400 Received: by fieldses.org (Postfix, from userid 2815) id 22B75607F; Thu, 20 Jun 2019 10:51:21 -0400 (EDT) From: "J. Bruce Fields" To: linux-nfs@vger.kernel.org Cc: "J. Bruce Fields" Subject: [PATCH 08/16] nfsd: escape high characters in binary data Date: Thu, 20 Jun 2019 10:51:07 -0400 Message-Id: <1561042275-12723-9-git-send-email-bfields@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1561042275-12723-1-git-send-email-bfields@redhat.com> References: <1561042275-12723-1-git-send-email-bfields@redhat.com> Sender: linux-nfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org From: "J. Bruce Fields" I'm exposing some information about NFS clients in pseudofiles. I expect to eventually have simple tools to help read those pseudofiles. But it's also helpful if the raw files are human-readable to the extent possible. It aids debugging and makes them usable on systems that don't have the latest nfs-utils. A minor challenge there is opaque client-generated protocol objects like state owners and client identifiers. Some clients generate those to include handy information in plain ascii. But they may also include arbitrary byte sequences. I think the simplest approach is to limit to isprint(c) && isascii(c) and escape everything else. That means you can just cat the file and get something that looks OK. Also, I'm trying to keep these files legal YAML, which requires them to UTF-8, and this is a simple way to guarantee that. Signed-off-by: J. Bruce Fields --- fs/seq_file.c | 11 +++++++++++ include/linux/seq_file.h | 1 + include/linux/string_helpers.h | 3 +++ lib/string_helpers.c | 19 +++++++++++++++++++ 4 files changed, 34 insertions(+) diff --git a/fs/seq_file.c b/fs/seq_file.c index abe27ec43176..04f09689cd6d 100644 --- a/fs/seq_file.c +++ b/fs/seq_file.c @@ -384,6 +384,17 @@ void seq_escape(struct seq_file *m, const char *s, const char *esc) } EXPORT_SYMBOL(seq_escape); +void seq_escape_mem_ascii(struct seq_file *m, const char *src, size_t isz) +{ + char *buf; + size_t size = seq_get_buf(m, &buf); + int ret; + + ret = string_escape_mem_ascii(src, isz, buf, size); + seq_commit(m, ret < size ? ret : -1); +} +EXPORT_SYMBOL(seq_escape_mem_ascii); + void seq_vprintf(struct seq_file *m, const char *f, va_list args) { int len; diff --git a/include/linux/seq_file.h b/include/linux/seq_file.h index a121982af0f5..5998e1f4ff06 100644 --- a/include/linux/seq_file.h +++ b/include/linux/seq_file.h @@ -127,6 +127,7 @@ void seq_put_hex_ll(struct seq_file *m, const char *delimiter, unsigned long long v, unsigned int width); void seq_escape(struct seq_file *m, const char *s, const char *esc); +void seq_escape_mem_ascii(struct seq_file *m, const char *src, size_t isz); void seq_hex_dump(struct seq_file *m, const char *prefix_str, int prefix_type, int rowsize, int groupsize, const void *buf, size_t len, diff --git a/include/linux/string_helpers.h b/include/linux/string_helpers.h index d23c5030901a..c28955132234 100644 --- a/include/linux/string_helpers.h +++ b/include/linux/string_helpers.h @@ -54,6 +54,9 @@ static inline int string_unescape_any_inplace(char *buf) int string_escape_mem(const char *src, size_t isz, char *dst, size_t osz, unsigned int flags, const char *only); +int string_escape_mem_ascii(const char *src, size_t isz, char *dst, + size_t osz); + static inline int string_escape_mem_any_np(const char *src, size_t isz, char *dst, size_t osz, const char *only) { diff --git a/lib/string_helpers.c b/lib/string_helpers.c index 29c490e5d478..9ca19918ca26 100644 --- a/lib/string_helpers.c +++ b/lib/string_helpers.c @@ -539,6 +539,25 @@ int string_escape_mem(const char *src, size_t isz, char *dst, size_t osz, } EXPORT_SYMBOL(string_escape_mem); +int string_escape_mem_ascii(const char *src, size_t isz, char *dst, + size_t osz) +{ + char *p = dst; + char *end = p + osz; + + while (isz--) { + unsigned char c = *src++; + + if (!isprint(c) || !isascii(c) || c == '"' || c == '\\') + escape_hex(c, &p, end); + else + escape_passthrough(c, &p, end); + } + + return p - dst; +} +EXPORT_SYMBOL(string_escape_mem_ascii); + /* * Return an allocated string that has been escaped of special characters * and double quotes, making it safe to log in quotes. -- 2.21.0