Browse Source

Fix bug in strncasecmp

jD91mZM2 6 years ago
parent
commit
edb95246d4
3 changed files with 9 additions and 5 deletions
  1. 1 1
      Cargo.toml
  2. 4 4
      src/header/strings/mod.rs
  3. 4 0
      tests/strings.c

+ 1 - 1
Cargo.toml

@@ -40,7 +40,7 @@ redox_syscall = { git = "https://gitlab.redox-os.org/redox-os/syscall.git", bran
 spin = "0.4"
 
 [features]
-default = ["trace"]
+#default = ["trace"]
 trace = []
 
 [profile.dev]

+ 4 - 4
src/header/strings/mod.rs

@@ -76,14 +76,14 @@ pub unsafe extern "C" fn strncasecmp(
     mut second: *const c_char,
     mut n: size_t,
 ) -> c_int {
-    while *first & !32 == *second & !32 {
-        if n == 0 || *first == 0 && *second == 0 {
-            return 0;
+    while n > 0 && (*first != 0 || *second != 0) {
+        if *first & !32 != *second & !32 {
+            return -1;
         }
 
         first = first.offset(1);
         second = second.offset(1);
         n -= 1;
     }
-    -1
+    0
 }

+ 4 - 0
tests/strings.c

@@ -11,8 +11,12 @@ int main() {
     bcopy("hi", new, 3); // include nul byte
 
     assert(!strcasecmp("hi", new));
+    assert(strcasecmp("he", new));
     assert(!strcasecmp("hello", "HEllO"));
+    assert(strcasecmp("hello", "HEllOo"));
     assert(!strncasecmp("hello", "Hello World", 5));
+    assert(!strncasecmp("FLOOR0_1", "FLOOR0_1FLOOR4_1", 8));
+    assert(strncasecmp("FL00RO_1", "FLOOR0_1FLOOR4_1", 8));
 
     bzero(new, 1);
     assert(*new == 0);