diff options
| author | E. Westbrook <github@westbrook.io> | 2018-08-21 09:59:45 -0600 |
|---|---|---|
| committer | E. Westbrook <github@westbrook.io> | 2018-08-21 09:59:45 -0600 |
| commit | 7ccea58776b8084f29a48610cb44b17ca604e4b5 (patch) | |
| tree | 72dfafe326432f522be33b54170e92d7c4c9a382 | |
| parent | c570a32c219c957fd405ed018f2500f06952c043 (diff) | |
| download | luasocket-7ccea58776b8084f29a48610cb44b17ca604e4b5.tar.gz luasocket-7ccea58776b8084f29a48610cb44b17ca604e4b5.tar.bz2 luasocket-7ccea58776b8084f29a48610cb44b17ca604e4b5.zip | |
url.lua:remove_dot_components(): avoid overconsuming dot segments
| -rw-r--r-- | src/url.lua | 4 | ||||
| -rw-r--r-- | test/urltest.lua | 5 |
2 files changed, 7 insertions, 2 deletions
diff --git a/src/url.lua b/src/url.lua index 0d88adb..e1fa2bc 100644 --- a/src/url.lua +++ b/src/url.lua | |||
| @@ -85,11 +85,11 @@ end | |||
| 85 | local function remove_dot_components(path) | 85 | local function remove_dot_components(path) |
| 86 | repeat | 86 | repeat |
| 87 | local was = path | 87 | local was = path |
| 88 | path = path:gsub('/%./', '/') | 88 | path = path:gsub('/%./', '/', 1) |
| 89 | until path == was | 89 | until path == was |
| 90 | repeat | 90 | repeat |
| 91 | local was = path | 91 | local was = path |
| 92 | path = path:gsub('[^/]+/%.%./([^/]+)', '%1') | 92 | path = path:gsub('[^/]+/%.%./([^/]+)', '%1', 1) |
| 93 | until path == was | 93 | until path == was |
| 94 | path = path:gsub('[^/]+/%.%./*$', '') | 94 | path = path:gsub('[^/]+/%.%./*$', '') |
| 95 | path = path:gsub('/%.%.$', '/') | 95 | path = path:gsub('/%.%.$', '/') |
diff --git a/test/urltest.lua b/test/urltest.lua index 8664fa6..04b3c7f 100644 --- a/test/urltest.lua +++ b/test/urltest.lua | |||
| @@ -654,6 +654,7 @@ check_absolute_url("http://a/b/c/d;p?q#f", "../g", "http://a/b/g") | |||
| 654 | check_absolute_url("http://a/b/c/d;p?q#f", "../..", "http://a/") | 654 | check_absolute_url("http://a/b/c/d;p?q#f", "../..", "http://a/") |
| 655 | check_absolute_url("http://a/b/c/d;p?q#f", "../../", "http://a/") | 655 | check_absolute_url("http://a/b/c/d;p?q#f", "../../", "http://a/") |
| 656 | check_absolute_url("http://a/b/c/d;p?q#f", "../../g", "http://a/g") | 656 | check_absolute_url("http://a/b/c/d;p?q#f", "../../g", "http://a/g") |
| 657 | check_absolute_url("http://a/b/c/d;p?q#f", "../../../g", "http://a/g") | ||
| 657 | check_absolute_url("http://a/b/c/d;p?q#f", "", "http://a/b/c/d;p?q#f") | 658 | check_absolute_url("http://a/b/c/d;p?q#f", "", "http://a/b/c/d;p?q#f") |
| 658 | check_absolute_url("http://a/b/c/d;p?q#f", "/./g", "http://a/g") | 659 | check_absolute_url("http://a/b/c/d;p?q#f", "/./g", "http://a/g") |
| 659 | check_absolute_url("http://a/b/c/d;p?q#f", "/../g", "http://a/g") | 660 | check_absolute_url("http://a/b/c/d;p?q#f", "/../g", "http://a/g") |
| @@ -686,6 +687,10 @@ check_absolute_url("http://velox.telemar.com.br", "/dashboard/index.html", | |||
| 686 | "http://velox.telemar.com.br/dashboard/index.html") | 687 | "http://velox.telemar.com.br/dashboard/index.html") |
| 687 | check_absolute_url("http://example.com/", "../.badhost.com/", "http://example.com/.badhost.com/") | 688 | check_absolute_url("http://example.com/", "../.badhost.com/", "http://example.com/.badhost.com/") |
| 688 | check_absolute_url("http://example.com/", "...badhost.com/", "http://example.com/...badhost.com/") | 689 | check_absolute_url("http://example.com/", "...badhost.com/", "http://example.com/...badhost.com/") |
| 690 | check_absolute_url("http://example.com/a/b/c/d/", "../q", "http://example.com/a/b/c/q") | ||
| 691 | check_absolute_url("http://example.com/a/b/c/d/", "../../q", "http://example.com/a/b/q") | ||
| 692 | check_absolute_url("http://example.com/a/b/c/d/", "../../../q", "http://example.com/a/q") | ||
| 693 | check_absolute_url("http://example.com/a/b/c/d/", "../../../../q", "http://example.com/q") | ||
| 689 | 694 | ||
| 690 | print("testing path parsing and composition") | 695 | print("testing path parsing and composition") |
| 691 | check_parse_path("/eu/tu/ele", { "eu", "tu", "ele"; is_absolute = 1 }) | 696 | check_parse_path("/eu/tu/ele", { "eu", "tu", "ele"; is_absolute = 1 }) |
