]> git.lizzy.rs Git - rust.git/blobdiff - src/lib/int.rs
Correct handling of non-numeric chars in parse_buf
[rust.git] / src / lib / int.rs
index e0c0a97f0ba0208e795cd0a0af88f70f91ea57ef..1dae4488b0b9b6b2f3101ee7102be5393821feaf 100644 (file)
@@ -103,16 +103,26 @@ fn parse_buf(buf: [u8], radix: uint) -> int {
         fail;
     }
     let i = vec::len::<u8>(buf) - 1u;
+    let start = 0u;
     let power = 1;
+
     if buf[0] == ('-' as u8) {
         power = -1;
-        i -= 1u;
+        start = 1u;
     }
     let n = 0;
     while true {
-        n += (buf[i] - ('0' as u8) as int) * power;
+        let digit = alt buf[i] as char {
+            '0' to '9' { buf[i] - ('0' as u8) }
+            'a' to 'z' { 10u8 + buf[i] - ('a' as u8) }
+            'A' to 'Z' { 10u8 + buf[i] - ('A' as u8) }
+        };
+        if (digit as uint) >= radix {
+            fail;
+        }
+        n += (digit as int) * power;
         power *= radix as int;
-        if i == 0u { ret n; }
+        if i <= start { ret n; }
         i -= 1u;
     }
     fail;