summaryrefslogtreecommitdiffstats
path: root/patches/boa-0.94.14rc21/0006-buffer_escape.diff.patch
blob: d35e0cc9c10b140ffc5e8b635ae6828f6da050e2 (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
27
28
29
30
31
32
33
34
35
36
37
38
39
From b46d216b3673246e7299a22dfb88a8f0d7538e5a Mon Sep 17 00:00:00 2001
From: debian.org <debian.org>
Date: Mon, 22 Feb 2010 23:14:35 +0100
Subject: [PATCH 6/6] buffer_escape.diff

http://ftp.de.debian.org/debian/pool/main/b/boa/boa_0.94.14rc21-3.1.diff.gz
---
 src/buffer.c |    8 +++++++-
 1 files changed, 7 insertions(+), 1 deletions(-)

diff --git a/src/buffer.c b/src/buffer.c
index 3663725..0a23f58 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);
-- 
1.7.0