summaryrefslogtreecommitdiffstats
path: root/lib/string_helpers.c
diff options
context:
space:
mode:
authorKees Cook <keescook@chromium.org>2016-04-20 18:46:23 -0400
committerJames Morris <james.l.morris@oracle.com>2016-04-20 20:47:25 -0400
commitb53f27e4fa0d0e72d897830cc4f3f83d2a25d952 (patch)
treeb4834a2f32c2b1db43ea8e7a66600a3bfd2257fa /lib/string_helpers.c
parent3c9d6296b7aee536a96ea2b53a15d23511738c1c (diff)
string_helpers: add kstrdup_quotable
Handle allocating and escaping a string safe for logging. Signed-off-by: Kees Cook <keescook@chromium.org> Signed-off-by: James Morris <james.l.morris@oracle.com>
Diffstat (limited to 'lib/string_helpers.c')
-rw-r--r--lib/string_helpers.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/lib/string_helpers.c b/lib/string_helpers.c
index 5c88204b6f1f..aa00c9f989ee 100644
--- a/lib/string_helpers.c
+++ b/lib/string_helpers.c
@@ -10,6 +10,7 @@
10#include <linux/export.h> 10#include <linux/export.h>
11#include <linux/ctype.h> 11#include <linux/ctype.h>
12#include <linux/errno.h> 12#include <linux/errno.h>
13#include <linux/slab.h>
13#include <linux/string.h> 14#include <linux/string.h>
14#include <linux/string_helpers.h> 15#include <linux/string_helpers.h>
15 16
@@ -534,3 +535,30 @@ int string_escape_mem(const char *src, size_t isz, char *dst, size_t osz,
534 return p - dst; 535 return p - dst;
535} 536}
536EXPORT_SYMBOL(string_escape_mem); 537EXPORT_SYMBOL(string_escape_mem);
538
539/*
540 * Return an allocated string that has been escaped of special characters
541 * and double quotes, making it safe to log in quotes.
542 */
543char *kstrdup_quotable(const char *src, gfp_t gfp)
544{
545 size_t slen, dlen;
546 char *dst;
547 const int flags = ESCAPE_HEX;
548 const char esc[] = "\f\n\r\t\v\a\e\\\"";
549
550 if (!src)
551 return NULL;
552 slen = strlen(src);
553
554 dlen = string_escape_mem(src, slen, NULL, 0, flags, esc);
555 dst = kmalloc(dlen + 1, gfp);
556 if (!dst)
557 return NULL;
558
559 WARN_ON(string_escape_mem(src, slen, dst, dlen, flags, esc) != dlen);
560 dst[dlen] = '\0';
561
562 return dst;
563}
564EXPORT_SYMBOL_GPL(kstrdup_quotable);