[build-path-prefix-map-spec] 26/50: Don't allow unsupported %-sequences
Ximin Luo
infinity0 at debian.org
Fri Mar 10 15:17:20 UTC 2017
This is an automated email from the git hooks/post-receive script.
infinity0 pushed a commit to branch master
in repository build-path-prefix-map-spec.
commit 8bb20184d106732a64c005546d1d08ca36e7c011
Author: Ximin Luo <infinity0 at debian.org>
Date: Mon Feb 13 15:57:47 2017 +0100
Don't allow unsupported %-sequences
---
consume/pecsplit.c | 3 +++
consume/pecsplit.js | 3 ++-
consume/pecsplit.py | 2 ++
consume/pecsplit.rs | 18 ++++++++++++------
consume/testcases/pecsplit.0.long-pc.env | 1 -
consume/testcases/pecsplit.0.long-pc.in | 4 ----
consume/testcases/pecsplit.0.long-pc.out | 4 ----
consume/testcases/pecsplit.0.non-utf8.env | 2 +-
consume/testcases/pecsplit.0.plain-pc.in | 3 ---
consume/testcases/pecsplit.0.plain-pc.out | 3 ---
consume/testcases/pecsplit.0.short-pc.in | 4 ----
consume/testcases/pecsplit.0.short-pc.out | 4 ----
consume/testcases/pecsplit.1.long-pc.env | 1 +
...pecsplit.0.allbytes-ok.in => pecsplit.1.long-pc.in} | 0
...plit.1.many-=-not-ok.out => pecsplit.1.long-pc.out} | 0
...pecsplit.0.plain-pc.env => pecsplit.1.plain-pc.env} | 0
...ecsplit.0.allbytes-ok.in => pecsplit.1.plain-pc.in} | 0
...lit.1.many-=-not-ok.out => pecsplit.1.plain-pc.out} | 0
...pecsplit.0.short-pc.env => pecsplit.1.short-pc.env} | 0
...ecsplit.0.allbytes-ok.in => pecsplit.1.short-pc.in} | 0
...lit.1.many-=-not-ok.out => pecsplit.1.short-pc.out} | 0
21 files changed, 21 insertions(+), 31 deletions(-)
diff --git a/consume/pecsplit.c b/consume/pecsplit.c
index 73fbf91..bc4d955 100644
--- a/consume/pecsplit.c
+++ b/consume/pecsplit.c
@@ -23,6 +23,9 @@ unquote (char *src)
unquoted:
case 'p':
++src;
+ break;
+ default:
+ return 0; // invalid
}
}
return 1;
diff --git a/consume/pecsplit.js b/consume/pecsplit.js
index 68cf460..d22f22a 100755
--- a/consume/pecsplit.js
+++ b/consume/pecsplit.js
@@ -1,13 +1,14 @@
#!/usr/bin/nodejs
var unquote = function(x) {
+ if (x.search(/%[^pec]|%$/) >= 0) throw "invalid value: bad escape: " + x;
return x.replace(/%c/g, ':').replace(/%e/g, '=').replace(/%p/g, '%');
};
var parse_prefix_map = function(x) {
return (x || "").split(/:/g).filter(Boolean).map(function(part) {
var tuples = part.split(/=/g).map(unquote);
- if (tuples.length !== 2) throw "invalid value: " + x;
+ if (tuples.length !== 2) throw "invalid value: not a pair: " + pair;
return tuples;
});
};
diff --git a/consume/pecsplit.py b/consume/pecsplit.py
index fdf6a1d..b04a79d 100755
--- a/consume/pecsplit.py
+++ b/consume/pecsplit.py
@@ -1,11 +1,13 @@
#!/usr/bin/python3
+import re
import os
import sys
# Parsing the variable
def _dequote(part):
+ if re.search(r"%[^pec]|%$", part): raise ValueError("bad escape: %s" % part)
return part.replace("%c", ':').replace("%e", '=').replace("%p", '%');
def decode(prefix_str):
diff --git a/consume/pecsplit.rs b/consume/pecsplit.rs
index 0c57390..82da677 100644
--- a/consume/pecsplit.rs
+++ b/consume/pecsplit.rs
@@ -9,7 +9,9 @@ fn pathbuf_to_u8(path: &PathBuf) -> &[u8] {
}
/* the polymorphism is to handle u8 (POSIX) and u16 (windows) */
-fn dequote<T>(s: &[T]) -> Vec<T> where u16: From<T>, T: From<u8>, T: Copy {
+fn dequote<T>(s: &[T]) -> Result<Vec<T>, &'static str> where u16: From<T>, T: From<u8>, T: Copy {
+ // unfortunately we can't do sting-replace on arbitrary Vecs
+ // s.replace("%c", ':').replace("%e", '=').replace("%p", '%')
let mut v = Vec::with_capacity(s.len());
let mut escaped = false;
for c in s {
@@ -23,14 +25,18 @@ fn dequote<T>(s: &[T]) -> Vec<T> where u16: From<T>, T: From<u8>, T: Copy {
0x70 /* p */ => { v.pop(); v.pop(); v.push(T::from(b'%')) },
0x65 /* e */ => { v.pop(); v.pop(); v.push(T::from(b'=')) },
0x63 /* c */ => { v.pop(); v.pop(); v.push(T::from(b':')) },
- _ => (),
+ _ => break // to the "Err" clause
}
}
}
escaped = c16 == 0x25
}
- v.shrink_to_fit();
- v
+ if escaped {
+ Err("invalid %-escape sequence")
+ } else {
+ v.shrink_to_fit();
+ Ok(v)
+ }
}
fn decode(prefix_str: Option<OsString>) -> Result<Vec<(PathBuf, PathBuf)>, &'static str> {
@@ -46,8 +52,8 @@ fn decode(prefix_str: Option<OsString>) -> Result<Vec<(PathBuf, PathBuf)>, &'sta
Err("either too few or too many '='")
} else {
// TODO: windows
- let src = OsString::from_vec(dequote(tuple[0]));
- let dst = OsString::from_vec(dequote(tuple[1]));
+ let src = OsString::from_vec(try!(dequote(tuple[0])));
+ let dst = OsString::from_vec(try!(dequote(tuple[1])));
Ok((PathBuf::from(src), PathBuf::from(dst)))
}
})
diff --git a/consume/testcases/pecsplit.0.long-pc.env b/consume/testcases/pecsplit.0.long-pc.env
deleted file mode 100644
index ee395af..0000000
--- a/consume/testcases/pecsplit.0.long-pc.env
+++ /dev/null
@@ -1 +0,0 @@
-/a/b%eyyy=ERROR:/a=lol%p%:/b%p=foo%%%%p+%:/a/b%eyyy=secreteh
diff --git a/consume/testcases/pecsplit.0.long-pc.in b/consume/testcases/pecsplit.0.long-pc.in
deleted file mode 100644
index d8d7867..0000000
--- a/consume/testcases/pecsplit.0.long-pc.in
+++ /dev/null
@@ -1,4 +0,0 @@
-/a/d
-/b/1234
-/b%/1234
-/a/b=yyy/xxx
diff --git a/consume/testcases/pecsplit.0.long-pc.out b/consume/testcases/pecsplit.0.long-pc.out
deleted file mode 100644
index cd847e5..0000000
--- a/consume/testcases/pecsplit.0.long-pc.out
+++ /dev/null
@@ -1,4 +0,0 @@
-lol%%/d
-/b/1234
-foo%%%%+%/1234
-secreteh/xxx
diff --git a/consume/testcases/pecsplit.0.non-utf8.env b/consume/testcases/pecsplit.0.non-utf8.env
index bdfa2a4..5215f13 100644
--- a/consume/testcases/pecsplit.0.non-utf8.env
+++ b/consume/testcases/pecsplit.0.non-utf8.env
@@ -1 +1 @@
-/a/b%eyyy=result�:/a=lol%p%:/b%p=foo%p%p:/a/b%eyyy=result�:/a/b%eyyy�=sec%creteh
+/a/b%eyyy=result�:/a=lol%p%p:/b%p=foo%p%p:/a/b%eyyy=result�:/a/b%eyyy�=sec%creteh
diff --git a/consume/testcases/pecsplit.0.plain-pc.in b/consume/testcases/pecsplit.0.plain-pc.in
deleted file mode 100644
index eb23270..0000000
--- a/consume/testcases/pecsplit.0.plain-pc.in
+++ /dev/null
@@ -1,3 +0,0 @@
-/a/d
-/b/1234
-/a/b%?yyy/xxx
diff --git a/consume/testcases/pecsplit.0.plain-pc.out b/consume/testcases/pecsplit.0.plain-pc.out
deleted file mode 100644
index ae70991..0000000
--- a/consume/testcases/pecsplit.0.plain-pc.out
+++ /dev/null
@@ -1,3 +0,0 @@
-lol/d
-foo/1234
-secrete%h/xxx
diff --git a/consume/testcases/pecsplit.0.short-pc.in b/consume/testcases/pecsplit.0.short-pc.in
deleted file mode 100644
index 1d712d5..0000000
--- a/consume/testcases/pecsplit.0.short-pc.in
+++ /dev/null
@@ -1,4 +0,0 @@
-/a/d
-/b/1234
-/b%/1234
-/a/b=yyy%/xxx
diff --git a/consume/testcases/pecsplit.0.short-pc.out b/consume/testcases/pecsplit.0.short-pc.out
deleted file mode 100644
index 1ea2a3c..0000000
--- a/consume/testcases/pecsplit.0.short-pc.out
+++ /dev/null
@@ -1,4 +0,0 @@
-lol%%/d
-/b/1234
-foo%%/1234
-sec:reteh/xxx
diff --git a/consume/testcases/pecsplit.1.long-pc.env b/consume/testcases/pecsplit.1.long-pc.env
new file mode 100644
index 0000000..c77c65e
--- /dev/null
+++ b/consume/testcases/pecsplit.1.long-pc.env
@@ -0,0 +1 @@
+/a/b%eyyy=ERROR:/a=lol%p:/b%p=foo%%%%p+:/a/b%eyyy=secreteh
diff --git a/consume/testcases/pecsplit.0.allbytes-ok.in b/consume/testcases/pecsplit.1.long-pc.in
similarity index 100%
copy from consume/testcases/pecsplit.0.allbytes-ok.in
copy to consume/testcases/pecsplit.1.long-pc.in
diff --git a/consume/testcases/pecsplit.1.many-=-not-ok.out b/consume/testcases/pecsplit.1.long-pc.out
similarity index 100%
copy from consume/testcases/pecsplit.1.many-=-not-ok.out
copy to consume/testcases/pecsplit.1.long-pc.out
diff --git a/consume/testcases/pecsplit.0.plain-pc.env b/consume/testcases/pecsplit.1.plain-pc.env
similarity index 100%
rename from consume/testcases/pecsplit.0.plain-pc.env
rename to consume/testcases/pecsplit.1.plain-pc.env
diff --git a/consume/testcases/pecsplit.0.allbytes-ok.in b/consume/testcases/pecsplit.1.plain-pc.in
similarity index 100%
copy from consume/testcases/pecsplit.0.allbytes-ok.in
copy to consume/testcases/pecsplit.1.plain-pc.in
diff --git a/consume/testcases/pecsplit.1.many-=-not-ok.out b/consume/testcases/pecsplit.1.plain-pc.out
similarity index 100%
copy from consume/testcases/pecsplit.1.many-=-not-ok.out
copy to consume/testcases/pecsplit.1.plain-pc.out
diff --git a/consume/testcases/pecsplit.0.short-pc.env b/consume/testcases/pecsplit.1.short-pc.env
similarity index 100%
rename from consume/testcases/pecsplit.0.short-pc.env
rename to consume/testcases/pecsplit.1.short-pc.env
diff --git a/consume/testcases/pecsplit.0.allbytes-ok.in b/consume/testcases/pecsplit.1.short-pc.in
similarity index 100%
copy from consume/testcases/pecsplit.0.allbytes-ok.in
copy to consume/testcases/pecsplit.1.short-pc.in
diff --git a/consume/testcases/pecsplit.1.many-=-not-ok.out b/consume/testcases/pecsplit.1.short-pc.out
similarity index 100%
copy from consume/testcases/pecsplit.1.many-=-not-ok.out
copy to consume/testcases/pecsplit.1.short-pc.out
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/reproducible/build-path-prefix-map-spec.git
More information about the Reproducible-commits
mailing list