summaryrefslogtreecommitdiffhomepage
path: root/libs/sgi-webuci/boa-patches/060-buffer_escape.patch
blob: 570c254e1633c283bc47f651ca984d4d69b7c1f7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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);