From de5050f7b12a4ea6565930de27dfd2dd502b465e Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Tue, 11 Aug 2015 00:30:08 +0100 Subject: [PATCH] Fix #124 integer underflow in slicing base URL path components. --- src/parser.rs | 3 ++- src/tests.rs | 10 ++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/parser.rs b/src/parser.rs index 3c4d1512..b0302351 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -7,6 +7,7 @@ // except according to those terms. use std::ascii::AsciiExt; +use std::cmp::max; use std::error::Error; use std::fmt::{self, Formatter}; @@ -284,7 +285,7 @@ fn parse_relative_url<'a>(input: &'a str, scheme: String, scheme_type: SchemeTyp path: path }), remaining) } else { - let base_path = &base.path[..base.path.len() - 1]; + let base_path = &base.path[..max(base.path.len(), 1) - 1]; // Relative path state let (path, remaining) = try!(parse_path( base_path, input, Context::UrlParser, scheme_type, parser)); diff --git a/src/tests.rs b/src/tests.rs index 47f84596..146ad3a2 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -291,3 +291,13 @@ fn new_directory_paths() { fn from_str() { assert!("http://testing.com/this".parse::().is_ok()); } + +#[test] +fn issue_124() { + let url: Url = "file:a".parse().unwrap(); + assert_eq!(url.path().unwrap(), ["a"]); + let url: Url = "file:...".parse().unwrap(); + assert_eq!(url.path().unwrap(), ["..."]); + let url: Url = "file:..".parse().unwrap(); + assert_eq!(url.path().unwrap(), [""]); +}