summaryrefslogtreecommitdiffhomepage
path: root/libs/sgi-webuci/boa-patches/060-buffer_escape.patch
diff options
context:
space:
mode:
Diffstat (limited to 'libs/sgi-webuci/boa-patches/060-buffer_escape.patch')
-rw-r--r--libs/sgi-webuci/boa-patches/060-buffer_escape.patch26
1 files changed, 26 insertions, 0 deletions
diff --git a/libs/sgi-webuci/boa-patches/060-buffer_escape.patch b/libs/sgi-webuci/boa-patches/060-buffer_escape.patch
new file mode 100644
index 000000000..570c254e1
--- /dev/null
+++ b/libs/sgi-webuci/boa-patches/060-buffer_escape.patch
@@ -0,0 +1,26 @@
+diff --git a/src/buffer.c b/src/buffer.c
+index 99f3e7c..6720e21 100644
+--- a/src/buffer.c
++++ b/src/buffer.c
+@@ -77,6 +77,7 @@ int req_write_escape_http(request * req, const char *msg)
+ char c, *dest;
+ const char *inp;
+
++ int skip = 0;
+ int left;
+ inp = msg;
+ dest = req->buffer + req->buffer_end;
+@@ -84,7 +85,12 @@ int req_write_escape_http(request * req, const char *msg)
+ * in the middle of a transfer of up to 3 bytes */
+ left = BUFFER_SIZE - req->buffer_end;
+ while ((c = *inp++) && left >= 3) {
+- if (needs_escape((unsigned int) c)) {
++ /* Lower the skip character count. */
++ if (skip) skip--;
++ /* If we have a '%', we skip the two follow characters. */
++ if (c == '%') skip = 2;
++
++ if (!skip && needs_escape((unsigned int) c)) {
+ *dest++ = '%';
+ *dest++ = INT_TO_HEX((c >> 4) & 0xf);
+ *dest++ = INT_TO_HEX(c & 0xf);