itEscape XML characters for types 0 and 1 - phroxy - Gopher to HTTP proxy Err z3bra.org 70 hgit clone git://git.z3bra.org/phroxy.git URL:git://git.z3bra.org/phroxy.git z3bra.org 70 1Log /scm/phroxy/log.gph z3bra.org 70 1Files /scm/phroxy/files.gph z3bra.org 70 1Refs /scm/phroxy/refs.gph z3bra.org 70 1LICENSE /scm/phroxy/file/LICENSE.gph z3bra.org 70 i--- Err z3bra.org 70 1commit f1491a5ecb91945b0ef4dc69aff9d8f05ce00fea /scm/phroxy/commit/f1491a5ecb91945b0ef4dc69aff9d8f05ce00fea.gph z3bra.org 70 1parent 0938e922f3ff3a0e7e50a3a49ebbbeee9f26588d /scm/phroxy/commit/0938e922f3ff3a0e7e50a3a49ebbbeee9f26588d.gph z3bra.org 70 hAuthor: Willy Goiffon URL:mailto:dev@z3bra.org z3bra.org 70 iDate: Thu, 22 Oct 2020 09:50:33 +0200 Err z3bra.org 70 i Err z3bra.org 70 iEscape XML characters for types 0 and 1 Err z3bra.org 70 i Err z3bra.org 70 iDiffstat: Err z3bra.org 70 i M phroxy.c | 28 +++++++++++++++++++--------- Err z3bra.org 70 i Err z3bra.org 70 i1 file changed, 19 insertions(+), 9 deletions(-) Err z3bra.org 70 i--- Err z3bra.org 70 1diff --git a/phroxy.c b/phroxy.c /scm/phroxy/file/phroxy.c.gph z3bra.org 70 it@@ -285,20 +285,30 @@ int Err z3bra.org 70 i printhtml(int fd, const char *data, size_t len) Err z3bra.org 70 i { Err z3bra.org 70 i size_t r, n; Err z3bra.org 70 i- const char *s, *e; Err z3bra.org 70 i+ const char *s, *e, *x; Err z3bra.org 70 i Err z3bra.org 70 i- n = 0; Err z3bra.org 70 i write(fd, "
", 5);	Err	z3bra.org	70
i-        while(n < len) {	Err	z3bra.org	70
i+	Err	z3bra.org	70
i+        for (n = 0; n < len; n++) {	Err	z3bra.org	70
i+	Err	z3bra.org	70
i                 s = data + n;	Err	z3bra.org	70
i-                e = strstr(s, "\n\n");	Err	z3bra.org	70
i-                r = e ? (size_t)(e - s + 2) : strlen(s);	Err	z3bra.org	70
i-                n += r;	Err	z3bra.org	70
i 	Err	z3bra.org	70
i-                if (!r)	Err	z3bra.org	70
i+                /* escape XML characters */	Err	z3bra.org	70
i+                x = NULL;	Err	z3bra.org	70
i+                switch (*s) {	Err	z3bra.org	70
i+                case '&': x = x ? x : "&"; /* FALLTHROUGH */	Err	z3bra.org	70
i+                case '<': x = x ? x : "<";  /* FALLTHROUGH */	Err	z3bra.org	70
i+                case '>': x = x ? x : ">";  /* FALLTHROUGH */	Err	z3bra.org	70
i+                        write(fd, x, strlen(x));	Err	z3bra.org	70
i                         break;	Err	z3bra.org	70
i-	Err	z3bra.org	70
i-                write(fd, s, r);	Err	z3bra.org	70
i+                default:	Err	z3bra.org	70
i+                        e = strpbrk(s, "&<>");	Err	z3bra.org	70
i+                        r = e ? (size_t)(e - s) : len - n;	Err	z3bra.org	70
i+                        if (r) {	Err	z3bra.org	70
i+                                write(fd, s, r);	Err	z3bra.org	70
i+                                n += r - 1;	Err	z3bra.org	70
i+                        }	Err	z3bra.org	70
i+                }	Err	z3bra.org	70
i         }	Err	z3bra.org	70
i         write(fd, "
\n", 7); Err z3bra.org 70 i return 0; Err z3bra.org 70 .