annotate src/core/ngx_regex.c @ 676:bfa81a0490a2 NGINX_1_3_1

nginx 1.3.1 *) Security: now nginx/Windows ignores trailing dot in URI path component, and does not allow URIs with ":$" in it. Thanks to Vladimir Kochetkov, Positive Research Center. *) Feature: the "proxy_pass", "fastcgi_pass", "scgi_pass", "uwsgi_pass" directives, and the "server" directive inside the "upstream" block, now support IPv6 addresses. *) Feature: the "resolver" directive now support IPv6 addresses and an optional port specification. *) Feature: the "least_conn" directive inside the "upstream" block. *) Feature: it is now possible to specify a weight for servers while using the "ip_hash" directive. *) Bugfix: a segmentation fault might occur in a worker process if the "image_filter" directive was used; the bug had appeared in 1.3.0. *) Bugfix: nginx could not be built with ngx_cpp_test_module; the bug had appeared in 1.1.12. *) Bugfix: access to variables from SSI and embedded perl module might not work after reconfiguration. Thanks to Yichun Zhang. *) Bugfix: in the ngx_http_xslt_filter_module. Thanks to Kuramoto Eiji. *) Bugfix: memory leak if $geoip_org variable was used. Thanks to Denis F. Latypoff. *) Bugfix: in the "proxy_cookie_domain" and "proxy_cookie_path" directives.
author Igor Sysoev <http://sysoev.ru>
date Tue, 05 Jun 2012 00:00:00 +0400
parents d0f7a625f27c
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2 /*
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
660
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
4 * Copyright (C) Nginx, Inc.
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
5 */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
6
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
7
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
8 #include <ngx_config.h>
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
9 #include <ngx_core.h>
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
10
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
11
656
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
12 typedef struct {
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
13 ngx_flag_t pcre_jit;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
14 } ngx_regex_conf_t;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
15
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
16
52
0d75d65c642f nginx 0.1.26
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
17 static void * ngx_libc_cdecl ngx_regex_malloc(size_t size);
0d75d65c642f nginx 0.1.26
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
18 static void ngx_libc_cdecl ngx_regex_free(void *p);
660
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
19 #if (NGX_HAVE_PCRE_JIT)
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
20 static void ngx_pcre_free_studies(void *data);
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
21 #endif
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
22
656
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
23 static ngx_int_t ngx_regex_module_init(ngx_cycle_t *cycle);
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
24
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
25 static void *ngx_regex_create_conf(ngx_cycle_t *cycle);
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
26 static char *ngx_regex_init_conf(ngx_cycle_t *cycle, void *conf);
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
27
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
28 static char *ngx_regex_pcre_jit(ngx_conf_t *cf, void *post, void *data);
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
29 static ngx_conf_post_t ngx_regex_pcre_jit_post = { ngx_regex_pcre_jit };
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
30
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
31
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
32 static ngx_command_t ngx_regex_commands[] = {
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
33
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
34 { ngx_string("pcre_jit"),
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
35 NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
36 ngx_conf_set_flag_slot,
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
37 0,
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
38 offsetof(ngx_regex_conf_t, pcre_jit),
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
39 &ngx_regex_pcre_jit_post },
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
40
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
41 ngx_null_command
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
42 };
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
43
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
44
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
45 static ngx_core_module_t ngx_regex_module_ctx = {
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
46 ngx_string("regex"),
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
47 ngx_regex_create_conf,
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
48 ngx_regex_init_conf
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
49 };
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
50
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
51
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
52 ngx_module_t ngx_regex_module = {
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
53 NGX_MODULE_V1,
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
54 &ngx_regex_module_ctx, /* module context */
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
55 ngx_regex_commands, /* module directives */
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
56 NGX_CORE_MODULE, /* module type */
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
57 NULL, /* init master */
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
58 ngx_regex_module_init, /* init module */
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
59 NULL, /* init process */
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
60 NULL, /* init thread */
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
61 NULL, /* exit thread */
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
62 NULL, /* exit process */
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
63 NULL, /* exit master */
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
64 NGX_MODULE_V1_PADDING
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
65 };
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
66
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
67
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
68 static ngx_pool_t *ngx_pcre_pool;
656
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
69 static ngx_list_t *ngx_pcre_studies;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
70
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
71
52
0d75d65c642f nginx 0.1.26
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
72 void
0d75d65c642f nginx 0.1.26
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
73 ngx_regex_init(void)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
74 {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
75 pcre_malloc = ngx_regex_malloc;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
76 pcre_free = ngx_regex_free;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
77 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
78
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
79
546
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
80 static ngx_inline void
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
81 ngx_regex_malloc_init(ngx_pool_t *pool)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
82 {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
83 #if (NGX_THREADS)
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
84 ngx_core_tls_t *tls;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
85
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
86 if (ngx_threaded) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
87 tls = ngx_thread_get_tls(ngx_core_tls_key);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
88 tls->pool = pool;
546
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
89 return;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
90 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
91
550
697030d79811 nginx 0.8.27
Igor Sysoev <http://sysoev.ru>
parents: 546
diff changeset
92 #endif
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
93
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
94 ngx_pcre_pool = pool;
546
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
95 }
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
96
546
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
97
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
98 static ngx_inline void
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
99 ngx_regex_malloc_done(void)
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
100 {
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
101 #if (NGX_THREADS)
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
102 ngx_core_tls_t *tls;
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
103
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
104 if (ngx_threaded) {
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
105 tls = ngx_thread_get_tls(ngx_core_tls_key);
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
106 tls->pool = NULL;
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
107 return;
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
108 }
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
109
550
697030d79811 nginx 0.8.27
Igor Sysoev <http://sysoev.ru>
parents: 546
diff changeset
110 #endif
546
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
111
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
112 ngx_pcre_pool = NULL;
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
113 }
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
114
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
115
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
116 ngx_int_t
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
117 ngx_regex_compile(ngx_regex_compile_t *rc)
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
118 {
656
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
119 int n, erroff;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
120 char *p;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
121 pcre *re;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
122 const char *errstr;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
123 ngx_regex_elt_t *elt;
546
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
124
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
125 ngx_regex_malloc_init(rc->pool);
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
126
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
127 re = pcre_compile((const char *) rc->pattern.data, (int) rc->options,
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
128 &errstr, &erroff, NULL);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
129
546
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
130 /* ensure that there is no current pool */
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
131 ngx_regex_malloc_done();
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
132
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
133 if (re == NULL) {
546
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
134 if ((size_t) erroff == rc->pattern.len) {
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
135 rc->err.len = ngx_snprintf(rc->err.data, rc->err.len,
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
136 "pcre_compile() failed: %s in \"%V\"",
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
137 errstr, &rc->pattern)
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
138 - rc->err.data;
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
139
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
140 } else {
546
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
141 rc->err.len = ngx_snprintf(rc->err.data, rc->err.len,
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
142 "pcre_compile() failed: %s in \"%V\" at \"%s\"",
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
143 errstr, &rc->pattern, rc->pattern.data + erroff)
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
144 - rc->err.data;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
145 }
546
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
146
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
147 return NGX_ERROR;
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
148 }
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
149
656
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
150 rc->regex = ngx_pcalloc(rc->pool, sizeof(ngx_regex_t));
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
151 if (rc->regex == NULL) {
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
152 return NGX_ERROR;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
153 }
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
154
676
bfa81a0490a2 nginx 1.3.1
Igor Sysoev <http://sysoev.ru>
parents: 660
diff changeset
155 rc->regex->code = re;
656
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
156
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
157 /* do not study at runtime */
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
158
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
159 if (ngx_pcre_studies != NULL) {
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
160 elt = ngx_list_push(ngx_pcre_studies);
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
161 if (elt == NULL) {
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
162 return NGX_ERROR;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
163 }
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
164
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
165 elt->regex = rc->regex;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
166 elt->name = rc->pattern.data;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
167 }
546
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
168
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
169 n = pcre_fullinfo(re, NULL, PCRE_INFO_CAPTURECOUNT, &rc->captures);
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
170 if (n < 0) {
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
171 p = "pcre_fullinfo(\"%V\", PCRE_INFO_CAPTURECOUNT) failed: %d";
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
172 goto failed;
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
173 }
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
174
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
175 if (rc->captures == 0) {
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
176 return NGX_OK;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
177 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
178
546
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
179 n = pcre_fullinfo(re, NULL, PCRE_INFO_NAMECOUNT, &rc->named_captures);
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
180 if (n < 0) {
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
181 p = "pcre_fullinfo(\"%V\", PCRE_INFO_NAMECOUNT) failed: %d";
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
182 goto failed;
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
183 }
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
184
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
185 if (rc->named_captures == 0) {
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
186 return NGX_OK;
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
187 }
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
188
546
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
189 n = pcre_fullinfo(re, NULL, PCRE_INFO_NAMEENTRYSIZE, &rc->name_size);
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
190 if (n < 0) {
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
191 p = "pcre_fullinfo(\"%V\", PCRE_INFO_NAMEENTRYSIZE) failed: %d";
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
192 goto failed;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
193 }
546
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
194
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
195 n = pcre_fullinfo(re, NULL, PCRE_INFO_NAMETABLE, &rc->names);
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
196 if (n < 0) {
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
197 p = "pcre_fullinfo(\"%V\", PCRE_INFO_NAMETABLE) failed: %d";
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
198 goto failed;
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
199 }
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
200
546
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
201 return NGX_OK;
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
202
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
203 failed:
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
204
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
205 rc->err.len = ngx_snprintf(rc->err.data, rc->err.len, p, &rc->pattern, n)
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
206 - rc->err.data;
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
207 return NGX_OK;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
208 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
209
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
210
52
0d75d65c642f nginx 0.1.26
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
211 ngx_int_t
358
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
212 ngx_regex_exec_array(ngx_array_t *a, ngx_str_t *s, ngx_log_t *log)
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
213 {
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
214 ngx_int_t n;
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
215 ngx_uint_t i;
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
216 ngx_regex_elt_t *re;
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
217
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
218 re = a->elts;
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
219
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
220 for (i = 0; i < a->nelts; i++) {
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
221
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
222 n = ngx_regex_exec(re[i].regex, s, NULL, 0);
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
223
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
224 if (n == NGX_REGEX_NO_MATCHED) {
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
225 continue;
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
226 }
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
227
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
228 if (n < 0) {
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
229 ngx_log_error(NGX_LOG_ALERT, log, 0,
546
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
230 ngx_regex_exec_n " failed: %i on \"%V\" using \"%s\"",
358
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
231 n, s, re[i].name);
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
232 return NGX_ERROR;
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
233 }
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
234
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
235 /* match */
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
236
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
237 return NGX_OK;
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
238 }
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
239
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
240 return NGX_DECLINED;
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
241 }
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
242
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
243
52
0d75d65c642f nginx 0.1.26
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
244 static void * ngx_libc_cdecl
0d75d65c642f nginx 0.1.26
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
245 ngx_regex_malloc(size_t size)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
246 {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
247 ngx_pool_t *pool;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
248 #if (NGX_THREADS)
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
249 ngx_core_tls_t *tls;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
250
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
251 if (ngx_threaded) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
252 tls = ngx_thread_get_tls(ngx_core_tls_key);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
253 pool = tls->pool;
546
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
254
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
255 } else {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
256 pool = ngx_pcre_pool;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
257 }
546
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
258
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
259 #else
546
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
260
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
261 pool = ngx_pcre_pool;
546
e19e5f542878 nginx 0.8.25
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
262
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
263 #endif
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
264
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
265 if (pool) {
382
984bb0b1399b nginx 0.7.3
Igor Sysoev <http://sysoev.ru>
parents: 380
diff changeset
266 return ngx_palloc(pool, size);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
267 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
268
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
269 return NULL;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
270 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
271
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
272
52
0d75d65c642f nginx 0.1.26
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
273 static void ngx_libc_cdecl
0d75d65c642f nginx 0.1.26
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
274 ngx_regex_free(void *p)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
275 {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
276 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
277 }
656
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
278
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
279
660
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
280 #if (NGX_HAVE_PCRE_JIT)
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
281
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
282 static void
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
283 ngx_pcre_free_studies(void *data)
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
284 {
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
285 ngx_list_t *studies = data;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
286
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
287 ngx_uint_t i;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
288 ngx_list_part_t *part;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
289 ngx_regex_elt_t *elts;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
290
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
291 part = &studies->part;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
292 elts = part->elts;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
293
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
294 for (i = 0 ; /* void */ ; i++) {
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
295
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
296 if (i >= part->nelts) {
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
297 if (part->next == NULL) {
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
298 break;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
299 }
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
300
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
301 part = part->next;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
302 elts = part->elts;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
303 i = 0;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
304 }
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
305
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
306 if (elts[i].regex->extra != NULL) {
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
307 pcre_free_study(elts[i].regex->extra);
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
308 }
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
309 }
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
310 }
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
311
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
312 #endif
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
313
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
314
656
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
315 static ngx_int_t
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
316 ngx_regex_module_init(ngx_cycle_t *cycle)
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
317 {
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
318 int opt;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
319 const char *errstr;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
320 ngx_uint_t i;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
321 ngx_list_part_t *part;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
322 ngx_regex_elt_t *elts;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
323
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
324 opt = 0;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
325
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
326 #if (NGX_HAVE_PCRE_JIT)
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
327 {
660
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
328 ngx_regex_conf_t *rcf;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
329 ngx_pool_cleanup_t *cln;
656
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
330
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
331 rcf = (ngx_regex_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_regex_module);
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
332
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
333 if (rcf->pcre_jit) {
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
334 opt = PCRE_STUDY_JIT_COMPILE;
660
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
335
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
336 /*
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
337 * The PCRE JIT compiler uses mmap for its executable codes, so we
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
338 * have to explicitly call the pcre_free_study() function to free
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
339 * this memory.
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
340 */
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
341
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
342 cln = ngx_pool_cleanup_add(cycle->pool, 0);
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
343 if (cln == NULL) {
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
344 return NGX_ERROR;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
345 }
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
346
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
347 cln->handler = ngx_pcre_free_studies;
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
348 cln->data = ngx_pcre_studies;
656
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
349 }
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
350 }
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
351 #endif
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
352
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
353 ngx_regex_malloc_init(cycle->pool);
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
354
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
355 part = &ngx_pcre_studies->part;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
356 elts = part->elts;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
357
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
358 for (i = 0 ; /* void */ ; i++) {
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
359
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
360 if (i >= part->nelts) {
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
361 if (part->next == NULL) {
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
362 break;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
363 }
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
364
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
365 part = part->next;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
366 elts = part->elts;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
367 i = 0;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
368 }
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
369
676
bfa81a0490a2 nginx 1.3.1
Igor Sysoev <http://sysoev.ru>
parents: 660
diff changeset
370 elts[i].regex->extra = pcre_study(elts[i].regex->code, opt, &errstr);
656
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
371
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
372 if (errstr != NULL) {
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
373 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
374 "pcre_study() failed: %s in \"%s\"",
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
375 errstr, elts[i].name);
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
376 }
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
377
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
378 #if (NGX_HAVE_PCRE_JIT)
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
379 if (opt & PCRE_STUDY_JIT_COMPILE) {
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
380 int jit, n;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
381
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
382 jit = 0;
676
bfa81a0490a2 nginx 1.3.1
Igor Sysoev <http://sysoev.ru>
parents: 660
diff changeset
383 n = pcre_fullinfo(elts[i].regex->code, elts[i].regex->extra,
656
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
384 PCRE_INFO_JIT, &jit);
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
385
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
386 if (n != 0 || jit != 1) {
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
387 ngx_log_error(NGX_LOG_INFO, cycle->log, 0,
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
388 "JIT compiler does not support pattern: \"%s\"",
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
389 elts[i].name);
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
390 }
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
391 }
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
392 #endif
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
393 }
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
394
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
395 ngx_regex_malloc_done();
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
396
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
397 ngx_pcre_studies = NULL;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
398
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
399 return NGX_OK;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
400 }
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
401
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
402
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
403 static void *
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
404 ngx_regex_create_conf(ngx_cycle_t *cycle)
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
405 {
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
406 ngx_regex_conf_t *rcf;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
407
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
408 rcf = ngx_pcalloc(cycle->pool, sizeof(ngx_regex_conf_t));
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
409 if (rcf == NULL) {
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
410 return NULL;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
411 }
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
412
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
413 rcf->pcre_jit = NGX_CONF_UNSET;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
414
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
415 ngx_pcre_studies = ngx_list_create(cycle->pool, 8, sizeof(ngx_regex_elt_t));
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
416 if (ngx_pcre_studies == NULL) {
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
417 return NULL;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
418 }
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
419
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
420 return rcf;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
421 }
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
422
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
423
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
424 static char *
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
425 ngx_regex_init_conf(ngx_cycle_t *cycle, void *conf)
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
426 {
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
427 ngx_regex_conf_t *rcf = conf;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
428
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
429 ngx_conf_init_value(rcf->pcre_jit, 0);
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
430
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
431 return NGX_CONF_OK;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
432 }
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
433
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
434
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
435 static char *
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
436 ngx_regex_pcre_jit(ngx_conf_t *cf, void *post, void *data)
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
437 {
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
438 ngx_flag_t *fp = data;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
439
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
440 if (*fp == 0) {
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
441 return NGX_CONF_OK;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
442 }
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
443
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
444 #if (NGX_HAVE_PCRE_JIT)
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
445 {
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
446 int jit, r;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
447
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
448 jit = 0;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
449 r = pcre_config(PCRE_CONFIG_JIT, &jit);
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
450
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
451 if (r != 0 || jit != 1) {
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
452 ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
453 "PCRE library does not support JIT");
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
454 *fp = 0;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
455 }
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
456 }
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
457 #else
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
458 ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
660
d0f7a625f27c nginx 1.1.14
Igor Sysoev <http://sysoev.ru>
parents: 656
diff changeset
459 "nginx was built without PCRE JIT support");
656
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
460 *fp = 0;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
461 #endif
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
462
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
463 return NGX_CONF_OK;
9d21dad0b5a1 nginx 1.1.12
Igor Sysoev <http://sysoev.ru>
parents: 654
diff changeset
464 }