[build-path-prefix-map-spec] 16/50: Switch to the new %=:-based encoding without hexdecode
Ximin Luo
infinity0 at debian.org
Fri Mar 10 15:17:19 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 c31bf2e7c2b667c0e7c82b3839dc3aec360a88e1
Author: Ximin Luo <infinity0 at debian.org>
Date: Fri Jan 27 19:09:33 2017 +0100
Switch to the new %=:-based encoding without hexdecode
This helps to avoid UTF-8 encode/decode issues with higher-level languages
---
consume/Makefile | 8 ++--
consume/{hexsplit.c => pecsplit.c} | 45 ++++++++++------------
consume/{hexsplit.js => pecsplit.js} | 11 +++---
consume/{hexsplit.py => pecsplit.py} | 4 +-
consume/testcases/0.basic.hexsplit.env | 1 -
consume/testcases/0.basic.pecsplit.env | 1 +
consume/testcases/README | 4 +-
consume/testcases/hexsplit.0.empty-ok.env | 1 -
consume/testcases/hexsplit.0.no-unicode-decode.env | 1 -
consume/testcases/hexsplit.0.no-unicode-decode.in | 1 -
consume/testcases/hexsplit.0.no-unicode-decode.out | 1 -
consume/testcases/hexsplit.1.invalid-%00.env | 1 -
consume/testcases/hexsplit.1.invalid-hex.env | 1 -
consume/testcases/hexsplit.1.many-=-not-ok.env | 1 -
consume/testcases/hexsplit.1.many-=-not-ok.out | 0
consume/testcases/hexsplit.1.short-hex.env | 1 -
consume/testcases/hexsplit.1.short-hex.in | 1 -
consume/testcases/hexsplit.1.short-hex.out | 0
consume/testcases/hexsplit.1.zero-=-not-ok.env | 1 -
consume/testcases/hexsplit.1.zero-=-not-ok.in | 1 -
consume/testcases/hexsplit.1.zero-=-not-ok.out | 0
....allbytes-ok.env => pecsplit.0.allbytes-ok.env} | 0
....0.allbytes-ok.in => pecsplit.0.allbytes-ok.in} | 0
....allbytes-ok.out => pecsplit.0.allbytes-ok.out} | 0
consume/testcases/pecsplit.0.empty-ok.env | 1 +
...xsplit.0.empty-ok.in => pecsplit.0.empty-ok.in} | 0
...plit.0.empty-ok.out => pecsplit.0.empty-ok.out} | 0
consume/testcases/pecsplit.0.short-pc.env | 1 +
...lit.1.invalid-%00.in => pecsplit.0.short-pc.in} | 0
...plit.0.empty-ok.out => pecsplit.0.short-pc.out} | 0
consume/testcases/pecsplit.1.many-=-not-ok.env | 1 +
....invalid-hex.in => pecsplit.1.many-=-not-ok.in} | 0
...nvalid-%00.out => pecsplit.1.many-=-not-ok.out} | 0
consume/testcases/pecsplit.1.zero-=-not-ok.env | 1 +
...any-=-not-ok.in => pecsplit.1.zero-=-not-ok.in} | 0
...nvalid-hex.out => pecsplit.1.zero-=-not-ok.out} | 0
36 files changed, 38 insertions(+), 51 deletions(-)
diff --git a/consume/Makefile b/consume/Makefile
index 5298b7d..5c65f97 100644
--- a/consume/Makefile
+++ b/consume/Makefile
@@ -1,9 +1,9 @@
TMPDIR = /run/shm/rb-prefix-map
T = testcases/
-ALL_FORMATS = hexsplit
-ALL_SOURCE = hexsplit.c
-ALLCHECK_hexsplit = hexsplit.c.out hexsplit.js hexsplit.py
+ALL_FORMATS = pecsplit
+ALL_SOURCE = pecsplit.c
+ALLCHECK_pecsplit = pecsplit.c.out pecsplit.js pecsplit.py
find_testcases = \
TESTCASES_$(1) = $(patsubst $(T)$(1).%.in,$(1).%,$(wildcard $(T)$(1).*.in))
@@ -48,7 +48,7 @@ check-%:
make-afl-test-case = \
cat testcases/$(3).$(1).env testcases/$(3).in > afl-in-$(1)/$(3).in;
-afl-in-%: $(wildcard $(T)/*.in) $(wildcard $(T)/*.env)
+afl-in-%: $(wildcard $(T)*.in) $(wildcard $(T)*.env)
mkdir -p "$@"
$(foreach case,$(TESTCASES_0),$(call make-afl-test-case,$*,0,$(case)))
$(foreach case,$(TESTCASES_1),$(call make-afl-test-case,$*,1,$(case)))
diff --git a/consume/hexsplit.c b/consume/pecsplit.c
similarity index 68%
rename from consume/hexsplit.c
rename to consume/pecsplit.c
index eee9532..ec00cbf 100644
--- a/consume/hexsplit.c
+++ b/consume/pecsplit.c
@@ -7,30 +7,25 @@
int
unquote (char *src)
{
- char *dest = src;
- char x[] = {0, 0, 0};
- char c;
- while (*src != 0)
- {
- switch (*src)
- {
- case ':':
- case '=':
- return 0; // invalid, should have been escaped
- case '%':
- if (!(x[0] = *++src) || !(x[1] = *++src))
- return 0; // invalid, past end of string
- sscanf(x, "%2hhx", &c);
- if (errno != 0 || !c)
- return 0; // invalid, not valid hex
- *dest = c;
- break;
- default:
- *dest = *src;
- }
- ++dest, ++src;
- }
- *dest = '\0';
+ for (char *dest = src; 0 != (*dest = *src); ++dest, ++src)
+ switch (*src)
+ {
+ case ':':
+ case '=':
+ return 0; // should have been escaped
+ case '%':
+ switch (*(src + 1))
+ {
+ case ';':
+ *dest = ':';
+ goto unquoted;
+ case '+':
+ *dest = '=';
+ unquoted:
+ case '%':
+ ++src;
+ }
+ }
return 1;
}
@@ -38,7 +33,7 @@ int
parse_prefix_map (char *arg, struct prefix_map *map)
{
char *p;
- p = strchr (arg, '='); // left-split, to match the urlencode algorithm
+ p = strchr (arg, '=');
if (!p)
return 0;
*p = '\0';
diff --git a/consume/hexsplit.js b/consume/pecsplit.js
similarity index 68%
rename from consume/hexsplit.js
rename to consume/pecsplit.js
index 8c58ed2..ab22147 100755
--- a/consume/hexsplit.js
+++ b/consume/pecsplit.js
@@ -1,14 +1,15 @@
#!/usr/bin/nodejs
var unquote = function(x) {
- if (x.indexOf("%00") >= 0) throw "invalid value: " + x;
- var parts = x.split(/=/g).map(decodeURIComponent);
- if (parts.length !== 2) throw "invalid value: " + x;
- return parts;
+ return x.replace(/%\+/g, '=').replace(/%;/g, ':').replace(/%%/g, '%');
};
var parse_prefix_map = function(x) {
- return x ? x.split(/:+/g).map(unquote) : [];
+ return x ? x.split(/:+/g).map(function(part) {
+ var tuples = part.split(/=/g).map(unquote);
+ if (tuples.length !== 2) throw "invalid value: " + x;
+ return tuples;
+ }) : [];
}
var map_prefix = function(string, pm) {
diff --git a/consume/hexsplit.py b/consume/pecsplit.py
similarity index 79%
rename from consume/hexsplit.py
rename to consume/pecsplit.py
index 7768214..5192e0c 100755
--- a/consume/hexsplit.py
+++ b/consume/pecsplit.py
@@ -8,9 +8,7 @@ import sys
chr_n0 = lambda x: (1/x, chr(x))[1]
def _dequote(part):
- subs = part.split("%")
- # Will raise if there are <2 chars after % or if these aren't valid hex or if it is %00
- return subs[0] + "".join(chr_n0(int(sub[0:2], 16)) + sub[2:] for sub in subs[1:])
+ return part.replace("%+", '=').replace("%;", ':').replace("%%", '%');
def decode(prefix_str):
tuples = (part.split("=") for part in prefix_str.split(":") if part)
diff --git a/consume/testcases/0.basic.hexsplit.env b/consume/testcases/0.basic.hexsplit.env
deleted file mode 100644
index 4ec0741..0000000
--- a/consume/testcases/0.basic.hexsplit.env
+++ /dev/null
@@ -1 +0,0 @@
-/a/b%3dyyy=ERROR:/a=lol:/b=foo:/a/b%3dyyy=secreteh
diff --git a/consume/testcases/0.basic.pecsplit.env b/consume/testcases/0.basic.pecsplit.env
new file mode 100644
index 0000000..e4482d6
--- /dev/null
+++ b/consume/testcases/0.basic.pecsplit.env
@@ -0,0 +1 @@
+/a/b%+yyy=ERROR:/a=lol:/b=foo:/a/b%+yyy=secreteh
diff --git a/consume/testcases/README b/consume/testcases/README
index 2c9562e..40a1027 100644
--- a/consume/testcases/README
+++ b/consume/testcases/README
@@ -10,5 +10,5 @@ Naming convention is like:
<format-name>.<expected return code>.<unique name>.env
<format-name>.<expected return code>.<unique name>.out
-hexsplit.0.allbytes-ok.env was created by running in python3:
->>> open("testcases/hexsplit.0.allbytes-ok.env", "wb").write(bytes(i for i in range(1, 255) if chr(i) not in "%=:\n") + b"=\n")
+pecsplit.0.allbytes-ok.env was created by running in python3:
+>>> open("testcases/pecsplit.0.allbytes-ok.env", "wb").write(bytes(i for i in range(1, 255) if chr(i) not in "%=:\n") + b"=\n")
diff --git a/consume/testcases/hexsplit.0.empty-ok.env b/consume/testcases/hexsplit.0.empty-ok.env
deleted file mode 100644
index 9dc8d42..0000000
--- a/consume/testcases/hexsplit.0.empty-ok.env
+++ /dev/null
@@ -1 +0,0 @@
-/a/b%3dyyy=ERROR:/a=lol::/b=foo:/a/b%3dyyy=secreteh
diff --git a/consume/testcases/hexsplit.0.no-unicode-decode.env b/consume/testcases/hexsplit.0.no-unicode-decode.env
deleted file mode 100644
index 96c5ba5..0000000
--- a/consume/testcases/hexsplit.0.no-unicode-decode.env
+++ /dev/null
@@ -1 +0,0 @@
-/a/b%ff%ffyyy=ERROR:/a=lol:/b=foo:%ff=a
diff --git a/consume/testcases/hexsplit.0.no-unicode-decode.in b/consume/testcases/hexsplit.0.no-unicode-decode.in
deleted file mode 100644
index 29e181e..0000000
--- a/consume/testcases/hexsplit.0.no-unicode-decode.in
+++ /dev/null
@@ -1 +0,0 @@
-�
diff --git a/consume/testcases/hexsplit.0.no-unicode-decode.out b/consume/testcases/hexsplit.0.no-unicode-decode.out
deleted file mode 100644
index 7898192..0000000
--- a/consume/testcases/hexsplit.0.no-unicode-decode.out
+++ /dev/null
@@ -1 +0,0 @@
-a
diff --git a/consume/testcases/hexsplit.1.invalid-%00.env b/consume/testcases/hexsplit.1.invalid-%00.env
deleted file mode 100644
index 505273f..0000000
--- a/consume/testcases/hexsplit.1.invalid-%00.env
+++ /dev/null
@@ -1 +0,0 @@
-/a/b%00yyy=ERROR:/a=lol:/b=foo:/a/b%3dyyy=secreteh
diff --git a/consume/testcases/hexsplit.1.invalid-hex.env b/consume/testcases/hexsplit.1.invalid-hex.env
deleted file mode 100644
index d34b41f..0000000
--- a/consume/testcases/hexsplit.1.invalid-hex.env
+++ /dev/null
@@ -1 +0,0 @@
-/a/b%zzyyy=ERROR:/a=lol:/b=foo:/a/b%3dyyy=secreteh
diff --git a/consume/testcases/hexsplit.1.many-=-not-ok.env b/consume/testcases/hexsplit.1.many-=-not-ok.env
deleted file mode 100644
index 5c6bb91..0000000
--- a/consume/testcases/hexsplit.1.many-=-not-ok.env
+++ /dev/null
@@ -1 +0,0 @@
-/a/b=yyy=ERROR:/a=lol:/b=foo:/a/b%3dyyy=secreteh
diff --git a/consume/testcases/hexsplit.1.many-=-not-ok.out b/consume/testcases/hexsplit.1.many-=-not-ok.out
deleted file mode 100644
index e69de29..0000000
diff --git a/consume/testcases/hexsplit.1.short-hex.env b/consume/testcases/hexsplit.1.short-hex.env
deleted file mode 100644
index bb571ed..0000000
--- a/consume/testcases/hexsplit.1.short-hex.env
+++ /dev/null
@@ -1 +0,0 @@
-/a/b%3dyyy=ERROR%:/a=lol:/b=foo:/a/b%3dyyy=secreteh
diff --git a/consume/testcases/hexsplit.1.short-hex.in b/consume/testcases/hexsplit.1.short-hex.in
deleted file mode 120000
index 997afa5..0000000
--- a/consume/testcases/hexsplit.1.short-hex.in
+++ /dev/null
@@ -1 +0,0 @@
-0.basic.in
\ No newline at end of file
diff --git a/consume/testcases/hexsplit.1.short-hex.out b/consume/testcases/hexsplit.1.short-hex.out
deleted file mode 100644
index e69de29..0000000
diff --git a/consume/testcases/hexsplit.1.zero-=-not-ok.env b/consume/testcases/hexsplit.1.zero-=-not-ok.env
deleted file mode 100644
index 78aa957..0000000
--- a/consume/testcases/hexsplit.1.zero-=-not-ok.env
+++ /dev/null
@@ -1 +0,0 @@
-/a/byyyERROR:/a=lol:/b=foo:/a/b%3dyyy=secreteh
diff --git a/consume/testcases/hexsplit.1.zero-=-not-ok.in b/consume/testcases/hexsplit.1.zero-=-not-ok.in
deleted file mode 120000
index 997afa5..0000000
--- a/consume/testcases/hexsplit.1.zero-=-not-ok.in
+++ /dev/null
@@ -1 +0,0 @@
-0.basic.in
\ No newline at end of file
diff --git a/consume/testcases/hexsplit.1.zero-=-not-ok.out b/consume/testcases/hexsplit.1.zero-=-not-ok.out
deleted file mode 100644
index e69de29..0000000
diff --git a/consume/testcases/hexsplit.0.allbytes-ok.env b/consume/testcases/pecsplit.0.allbytes-ok.env
similarity index 100%
rename from consume/testcases/hexsplit.0.allbytes-ok.env
rename to consume/testcases/pecsplit.0.allbytes-ok.env
diff --git a/consume/testcases/hexsplit.0.allbytes-ok.in b/consume/testcases/pecsplit.0.allbytes-ok.in
similarity index 100%
rename from consume/testcases/hexsplit.0.allbytes-ok.in
rename to consume/testcases/pecsplit.0.allbytes-ok.in
diff --git a/consume/testcases/hexsplit.0.allbytes-ok.out b/consume/testcases/pecsplit.0.allbytes-ok.out
similarity index 100%
rename from consume/testcases/hexsplit.0.allbytes-ok.out
rename to consume/testcases/pecsplit.0.allbytes-ok.out
diff --git a/consume/testcases/pecsplit.0.empty-ok.env b/consume/testcases/pecsplit.0.empty-ok.env
new file mode 100644
index 0000000..c4ad41b
--- /dev/null
+++ b/consume/testcases/pecsplit.0.empty-ok.env
@@ -0,0 +1 @@
+/a/b%+yyy=ERROR:/a=lol::/b=foo:/a/b%+yyy=secreteh
diff --git a/consume/testcases/hexsplit.0.empty-ok.in b/consume/testcases/pecsplit.0.empty-ok.in
similarity index 100%
rename from consume/testcases/hexsplit.0.empty-ok.in
rename to consume/testcases/pecsplit.0.empty-ok.in
diff --git a/consume/testcases/hexsplit.0.empty-ok.out b/consume/testcases/pecsplit.0.empty-ok.out
similarity index 100%
copy from consume/testcases/hexsplit.0.empty-ok.out
copy to consume/testcases/pecsplit.0.empty-ok.out
diff --git a/consume/testcases/pecsplit.0.short-pc.env b/consume/testcases/pecsplit.0.short-pc.env
new file mode 100644
index 0000000..0f994d0
--- /dev/null
+++ b/consume/testcases/pecsplit.0.short-pc.env
@@ -0,0 +1 @@
+/a/b%+yyy=ERROR%:/a=lol:/b=foo:/a/b%+yyy=secreteh
diff --git a/consume/testcases/hexsplit.1.invalid-%00.in b/consume/testcases/pecsplit.0.short-pc.in
similarity index 100%
rename from consume/testcases/hexsplit.1.invalid-%00.in
rename to consume/testcases/pecsplit.0.short-pc.in
diff --git a/consume/testcases/hexsplit.0.empty-ok.out b/consume/testcases/pecsplit.0.short-pc.out
similarity index 100%
rename from consume/testcases/hexsplit.0.empty-ok.out
rename to consume/testcases/pecsplit.0.short-pc.out
diff --git a/consume/testcases/pecsplit.1.many-=-not-ok.env b/consume/testcases/pecsplit.1.many-=-not-ok.env
new file mode 100644
index 0000000..c610108
--- /dev/null
+++ b/consume/testcases/pecsplit.1.many-=-not-ok.env
@@ -0,0 +1 @@
+/a/b=yyy=ERROR:/a=lol:/b=foo:/a/b%+yyy=secreteh
diff --git a/consume/testcases/hexsplit.1.invalid-hex.in b/consume/testcases/pecsplit.1.many-=-not-ok.in
similarity index 100%
rename from consume/testcases/hexsplit.1.invalid-hex.in
rename to consume/testcases/pecsplit.1.many-=-not-ok.in
diff --git a/consume/testcases/hexsplit.1.invalid-%00.out b/consume/testcases/pecsplit.1.many-=-not-ok.out
similarity index 100%
rename from consume/testcases/hexsplit.1.invalid-%00.out
rename to consume/testcases/pecsplit.1.many-=-not-ok.out
diff --git a/consume/testcases/pecsplit.1.zero-=-not-ok.env b/consume/testcases/pecsplit.1.zero-=-not-ok.env
new file mode 100644
index 0000000..cbe9a44
--- /dev/null
+++ b/consume/testcases/pecsplit.1.zero-=-not-ok.env
@@ -0,0 +1 @@
+/a/byyyERROR:/a=lol:/b=foo:/a/b%+yyy=secreteh
diff --git a/consume/testcases/hexsplit.1.many-=-not-ok.in b/consume/testcases/pecsplit.1.zero-=-not-ok.in
similarity index 100%
rename from consume/testcases/hexsplit.1.many-=-not-ok.in
rename to consume/testcases/pecsplit.1.zero-=-not-ok.in
diff --git a/consume/testcases/hexsplit.1.invalid-hex.out b/consume/testcases/pecsplit.1.zero-=-not-ok.out
similarity index 100%
rename from consume/testcases/hexsplit.1.invalid-hex.out
rename to consume/testcases/pecsplit.1.zero-=-not-ok.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