[<prev] [next>] [day] [month] [year] [list]
Message-Id: <f6e86653a5397aade63c39ab350198dd6e725d16.1477938758.git.joe@perches.com>
Date: Mon, 31 Oct 2016 11:34:49 -0700
From: Joe Perches <joe@...ches.com>
To: linux-kernel@...r.kernel.org
Subject: [RFC PATCH] string: Add strzcmp for a length limited strcmp
strncmp is commonly used when parsing early_param options where a
fixed string is matched without the trailing zero.
A few errors exist where string comparisons use strncmp and the
length of the comparison to perform is incorrectly specified.
ie:
strncmp(ptr, "string", 5)
where 5 should likely have been 6
There are a few of these in the kernel tree like:
drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c:2307:
if (!strncmp(opt, "eee_timer:", 6)) {
sound/firewire/bebob/bebob.c:180:
return strncmp(name, "FW Audiophile Bootloader", 15) != 0;
Perhaps it would be useful to introduce a function that does a
strcmp limited to the length of the 2nd string argument.
The second argument for strzcmp requires a char [], not a const char *
using a macro and BUILD_BUG_ON.
Signed-off-by: Joe Perches <joe@...ches.com>
---
include/linux/string.h | 7 +++++++
lib/string.c | 18 ++++++++++++++++++
2 files changed, 25 insertions(+)
diff --git a/include/linux/string.h b/include/linux/string.h
index 26b6f6a66f83..536d00164b26 100644
--- a/include/linux/string.h
+++ b/include/linux/string.h
@@ -5,6 +5,7 @@
#include <linux/compiler.h> /* for inline */
#include <linux/types.h> /* for size_t */
#include <linux/stddef.h> /* for NULL */
+#include <linux/bug.h>
#include <stdarg.h>
#include <uapi/linux/string.h>
@@ -44,6 +45,12 @@ extern int strcmp(const char *,const char *);
#ifndef __HAVE_ARCH_STRNCMP
extern int strncmp(const char *,const char *,__kernel_size_t);
#endif
+int _strzcmp(const char *, const char *);
+#define strzcmp(s1, s2) \
+({ \
+ BUILD_BUG_ON(!__same_type(s2, char [])); \
+ _strzcmp(s1, s2); \
+})
#ifndef __HAVE_ARCH_STRCASECMP
extern int strcasecmp(const char *s1, const char *s2);
#endif
diff --git a/lib/string.c b/lib/string.c
index ed83562a53ae..ca9e4eb26b85 100644
--- a/lib/string.c
+++ b/lib/string.c
@@ -360,6 +360,24 @@ int strncmp(const char *cs, const char *ct, size_t count)
EXPORT_SYMBOL(strncmp);
#endif
+/**
+ * _strzcmp - Compare two strings limited to the length of the 2nd string
+ * @cs: 1st string
+ * @ct: 2nd string
+ */
+int _strzcmp(const char *cs, const char *ct)
+{
+ while (*cs == *ct && *cs != 0) {
+ cs++;
+ ct++;
+ }
+ if (*ct == 0)
+ return 0;
+
+ return *(unsigned char *)cs < *(unsigned char *)ct ? -1: 1;
+}
+EXPORT_SYMBOL(_strzcmp);
+
#ifndef __HAVE_ARCH_STRCHR
/**
* strchr - Find the first occurrence of a character in a string
--
2.10.0.rc2.1.g053435c
Powered by blists - more mailing lists