[PATCH V2 2/8] string: fix strncmp function

Jason Cooper jason at lakedaemon.net
Wed Dec 18 13:50:58 EST 2013


On Wed, Dec 18, 2013 at 11:01:15AM -0500, Jason Cooper wrote:
> On Wed, Dec 18, 2013 at 12:52:03PM +0000, Russell King - ARM Linux wrote:
> > On Wed, Dec 18, 2013 at 01:23:26PM +0100, Daniel Mack wrote:
> > > On 12/18/2013 01:15 PM, Russell King - ARM Linux wrote:
> > > > For instance, can you be sure that there aren't any uses of strncmp()
> > > > which already test for less-than-zero etc?
> > > 
> > > In this case, yes. The code as it stands is very small, and users only
> > > check for the return value of these functions to be 0.
> > > 
> > > But I wonder whether that patch is needed at all. At least the rest of
> > > this series does not even seem to introduce new call sites of strcmp()
> > > or strncmp() ...
> > 
> > The implementation appears to be buggy as it stands - all it does is
> > sum up the differences in the whole string.
> > 
> > What if you're comparing two strings:
> > 
> > 	ac
> > 	ca
> > 
> > The first character has a difference of +2, the second has a difference
> > of -2.  Sum those together and you get zero.  Oh, the two strings are
> > identical!
> 
> Yes, you are correct, the implementation isn't perfect.  I'll correct it
> since I introduced it.

I've pushed the following:

-------8<---------------------------------
commit c3da82f0caa50c0efadbd6f129a326dda3fe3dec
Author: Jason Cooper <jason at lakedaemon.net>
Date:   Wed Dec 18 18:24:43 2013 +0000

    string: use kernel version of strncmp()
    
    Signed-off-by: Jason Cooper <jason at lakedaemon.net>

diff --git a/string.c b/string.c
index 5105490143c8..629c281f3abd 100644
--- a/string.c
+++ b/string.c
@@ -18,14 +18,18 @@ int strlen(const char *str)
 
 int strncmp(const char *stra, const char *strb, int len)
 {
-	int diff=0;
-	const char *a = stra;
-	const char *b = strb;
-
-	while ((a - stra) < len)
-		diff += *a++ - *b++;
-
-	return diff;
+	unsigned char c1, c2;
+
+	while (len) {
+		c1 = *stra++;
+		c2 = *strb++;
+		if (c1 != c2)
+			return c1 < c2 ? -1 : 1;
+		if (!c1)
+			break;
+		len--;
+	}
+	return 0;
 }
 
 void *gethexaddr(const char *str, const char **end)




More information about the linux-arm-kernel mailing list