]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
mm/util.c: add kstrimdup()
authorSebastian Capella <sebastian.capella@linaro.org>
Wed, 21 Oct 2015 22:03:54 +0000 (09:03 +1100)
committerStephen Rothwell <sfr@canb.auug.org.au>
Wed, 21 Oct 2015 22:03:54 +0000 (09:03 +1100)
kstrimdup() creates a whitespace-trimmed duplicate of the passed in
null-terminated string.  This is useful for strings coming from sysfs that
often include trailing whitespace due to user input.

Thanks to Joe Perches for this implementation.

Signed-off-by: Sebastian Capella <sebastian.capella@linaro.org>
Cc: Joe Perches <joe@perches.com>
Acked-by: David Rientjes <rientjes@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
include/linux/string.h
mm/util.c

index 9ef7795e65e40c5dfbee53726909fbcb2ce341b0..cc77d6477fc23e95e8fe9f344e680b2d654c71ef 100644 (file)
@@ -121,6 +121,7 @@ extern void kfree_const(const void *x);
 extern char *kstrdup(const char *s, gfp_t gfp);
 extern const char *kstrdup_const(const char *s, gfp_t gfp);
 extern char *kstrndup(const char *s, size_t len, gfp_t gfp);
+extern char *kstrimdup(const char *s, gfp_t gfp);
 extern void *kmemdup(const void *src, size_t len, gfp_t gfp);
 
 extern char **argv_split(gfp_t gfp, const char *str, int *argcp);
index 902b65a438991fb9bedc45f1a16700e0e53f50c4..55012d786a3545bc415d30b4774bf9b62dbf27ac 100644 (file)
--- a/mm/util.c
+++ b/mm/util.c
@@ -3,6 +3,7 @@
 #include <linux/string.h>
 #include <linux/compiler.h>
 #include <linux/export.h>
+#include <linux/ctype.h>
 #include <linux/err.h>
 #include <linux/sched.h>
 #include <linux/security.h>
@@ -99,6 +100,35 @@ char *kstrndup(const char *s, size_t max, gfp_t gfp)
 }
 EXPORT_SYMBOL(kstrndup);
 
+/**
+ * kstrimdup - Trim and copy a %NUL terminated string.
+ * @s: the string to trim and duplicate
+ * @gfp: the GFP mask used in the kmalloc() call when allocating memory
+ *
+ * Returns an address, which the caller must kfree, containing
+ * a duplicate of the passed string with leading and/or trailing
+ * whitespace (as defined by isspace) removed.
+ */
+char *kstrimdup(const char *s, gfp_t gfp)
+{
+       char *buf;
+       char *begin = skip_spaces(s);
+       size_t len = strlen(begin);
+
+       while (len && isspace(begin[len - 1]))
+               len--;
+
+       buf = kmalloc_track_caller(len + 1, gfp);
+       if (!buf)
+               return NULL;
+
+       memcpy(buf, begin, len);
+       buf[len] = '\0';
+
+       return buf;
+}
+EXPORT_SYMBOL(kstrimdup);
+
 /**
  * kmemdup - duplicate region of memory
  *