fix integer type issue in strverscmp
authorRich Felker <dalias@aerifal.cx>
Tue, 26 Feb 2013 06:42:11 +0000 (01:42 -0500)
committerRich Felker <dalias@aerifal.cx>
Tue, 26 Feb 2013 06:42:11 +0000 (01:42 -0500)
lenl-lenr is not a valid expression for a signed int return value from
strverscmp, since after implicit conversion from size_t to int this
difference could have the wrong sign or might even be zero. using the
difference for char values works since they're bounded well within the
range of differences representable by int, but it does not work for
size_t values.

src/string/strverscmp.c

index 33a42eed1162fb15b2d9e4387775dba087f5d5ef..94d2e15c4d98da0ca83cae4ca403b654e4d47ca6 100644 (file)
@@ -31,8 +31,10 @@ int strverscmp(const char *l, const char *r)
                while (isdigit(r[lenr]) ) lenr++;
                if (lenl==lenr) {
                        return (*l -  *r);
+               } else if (lenl>lenr) {
+                       return 1;
                } else {
-                       return (lenl - lenr);
+                       return -1;
                }
        } else {
                return (*l -  *r);