From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S965248AbcDLVTs (ORCPT ); Tue, 12 Apr 2016 17:19:48 -0400 Received: from h2.hallyn.com ([78.46.35.8]:32978 "EHLO h2.hallyn.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933686AbcDLVTp (ORCPT ); Tue, 12 Apr 2016 17:19:45 -0400 Date: Tue, 12 Apr 2016 16:19:42 -0500 From: "Serge E. Hallyn" To: Kees Cook Cc: James Morris , Joe Perches , Mimi Zohar , Andy Shevchenko , Andrew Morton , "Serge E. Hallyn" , Jonathan Corbet , Kalle Valo , Mauro Carvalho Chehab , Guenter Roeck , Jiri Slaby , Paul Moore , Stephen Smalley , Casey Schaufler , Andreas Gruenbacher , Rasmus Villemoes , Ulf Hansson , Vitaly Kuznetsov , linux-security-module@vger.kernel.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org Subject: Re: [PATCH v4 2/6] string_helpers: add kstrdup_quotable_cmdline Message-ID: <20160412211942.GB12324@mail.hallyn.com> References: <1460480085-32263-1-git-send-email-keescook@chromium.org> <1460480085-32263-3-git-send-email-keescook@chromium.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1460480085-32263-3-git-send-email-keescook@chromium.org> User-Agent: Mutt/1.5.21 (2010-09-15) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Quoting Kees Cook (keescook@chromium.org): > Provide an escaped (but readable: no inter-argument NULLs) commandline > safe for logging. > > Signed-off-by: Kees Cook Acked-by: Serge Hallyn > --- > include/linux/string_helpers.h | 1 + > lib/string_helpers.c | 34 ++++++++++++++++++++++++++++++++++ > 2 files changed, 35 insertions(+) > > diff --git a/include/linux/string_helpers.h b/include/linux/string_helpers.h > index 9de228af00c1..684d2695fc36 100644 > --- a/include/linux/string_helpers.h > +++ b/include/linux/string_helpers.h > @@ -69,5 +69,6 @@ static inline int string_escape_str_any_np(const char *src, char *dst, > } > > char *kstrdup_quotable(const char *src, gfp_t gfp); > +char *kstrdup_quotable_cmdline(struct task_struct *task, gfp_t gfp); > > #endif > diff --git a/lib/string_helpers.c b/lib/string_helpers.c > index aa00c9f989ee..b16ee85aaf87 100644 > --- a/lib/string_helpers.c > +++ b/lib/string_helpers.c > @@ -10,6 +10,7 @@ > #include > #include > #include > +#include > #include > #include > #include > @@ -562,3 +563,36 @@ char *kstrdup_quotable(const char *src, gfp_t gfp) > return dst; > } > EXPORT_SYMBOL_GPL(kstrdup_quotable); > + > +/* > + * Returns allocated NULL-terminated string containing process > + * command line, with inter-argument NULLs replaced with spaces, > + * and other special characters escaped. > + */ > +char *kstrdup_quotable_cmdline(struct task_struct *task, gfp_t gfp) > +{ > + char *buffer, *quoted; > + int i, res; > + > + buffer = kmalloc(PAGE_SIZE, GFP_TEMPORARY); > + if (!buffer) > + return NULL; > + > + res = get_cmdline(task, buffer, PAGE_SIZE - 1); > + buffer[res] = '\0'; > + > + /* Collapse trailing NULLs, leave res pointing to last non-NULL. */ > + while (--res >= 0 && buffer[res] == '\0') > + ; > + > + /* Replace inter-argument NULLs. */ > + for (i = 0; i <= res; i++) > + if (buffer[i] == '\0') > + buffer[i] = ' '; > + > + /* Make sure result is printable. */ > + quoted = kstrdup_quotable(buffer, gfp); > + kfree(buffer); > + return quoted; > +} > +EXPORT_SYMBOL_GPL(kstrdup_quotable_cmdline); > -- > 2.6.3