aboutsummaryrefslogtreecommitdiff
path: root/src/core/ngx_string.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/ngx_string.c')
-rw-r--r--src/core/ngx_string.c55
1 files changed, 48 insertions, 7 deletions
diff --git a/src/core/ngx_string.c b/src/core/ngx_string.c
index 37a75aab3..d63a23850 100644
--- a/src/core/ngx_string.c
+++ b/src/core/ngx_string.c
@@ -28,6 +28,20 @@ u_char *ngx_cpystrn(u_char *dst, u_char *src, size_t n)
}
+u_char *ngx_pstrdup(ngx_pool_t *pool, ngx_str_t *src)
+{
+ u_char *dst;
+
+ if (!(dst = ngx_palloc(pool, src->len))) {
+ return NULL;
+ }
+
+ ngx_memcpy(dst, src->data, src->len);
+
+ return dst;
+}
+
+
/*
* supported formats:
* %[0][width][x][X]O off_t
@@ -602,13 +616,14 @@ ngx_int_t ngx_decode_base64(ngx_str_t *dst, ngx_str_t *src)
}
-ngx_uint_t ngx_escape_uri(u_char *dst, u_char *src, size_t size,
- ngx_uint_t type)
+uintptr_t ngx_escape_uri(u_char *dst, u_char *src, size_t size, ngx_uint_t type)
{
ngx_uint_t i, n;
uint32_t *escape;
static u_char hex[] = "0123456789abcdef";
+ /* " ", "%", "?", %00-%1F, %7F-%FF */
+
static uint32_t uri[] =
{ 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
@@ -626,6 +641,27 @@ ngx_uint_t ngx_escape_uri(u_char *dst, u_char *src, size_t size,
0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
0xffffffff /* 1111 1111 1111 1111 1111 1111 1111 1111 */ };
+ /* " ", "%", "+", "?", %00-%1F, %7F-%FF */
+
+ static uint32_t args[] =
+ { 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
+
+ /* ?>=< ;:98 7654 3210 /.-, +*)( '&%$ #"! */
+ 0x80000821, /* 1000 0000 0000 0000 0000 1000 0010 0001 */
+
+ /* _^]\ [ZYX WVUT SRQP ONML KJIH GFED CBA@ */
+ 0x00000000, /* 0000 0000 0000 0000 0000 0000 0000 0000 */
+
+ /* ~}| {zyx wvut srqp onml kjih gfed cba` */
+ 0x80000000, /* 1000 0000 0000 0000 0000 0000 0000 0000 */
+
+ 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
+ 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
+ 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
+ 0xffffffff /* 1111 1111 1111 1111 1111 1111 1111 1111 */ };
+
+ /* " ", """, "%", "'", %00-%1F, %7F-%FF */
+
static uint32_t html[] =
{ 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
@@ -644,11 +680,16 @@ ngx_uint_t ngx_escape_uri(u_char *dst, u_char *src, size_t size,
0xffffffff /* 1111 1111 1111 1111 1111 1111 1111 1111 */ };
- if (type == NGX_ESCAPE_HTML) {
+ switch (type) {
+ case NGX_ESCAPE_HTML:
escape = html;
-
- } else {
+ break;
+ case NGX_ESCAPE_ARGS:
+ escape = args;
+ break;
+ default:
escape = uri;
+ break;
}
if (dst == NULL) {
@@ -664,7 +705,7 @@ ngx_uint_t ngx_escape_uri(u_char *dst, u_char *src, size_t size,
src++;
}
- return n;
+ return (uintptr_t) n;
}
for (i = 0; i < size; i++) {
@@ -679,5 +720,5 @@ ngx_uint_t ngx_escape_uri(u_char *dst, u_char *src, size_t size,
}
}
- return 0;
+ return (uintptr_t) dst;
}