[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