Skip to content

Commit e425e2c

Browse files
committed
tests: added the fake-merge-module and new test case covering the init_worker_by_lua* mutating another module's main_conf bug.
1 parent 9ade9e3 commit e425e2c

File tree

4 files changed

+208
-0
lines changed

4 files changed

+208
-0
lines changed

t/124-init-worker.t

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -699,3 +699,21 @@ This also affects merge_loc_conf
699699
ok
700700
--- no_error_log
701701
[error]
702+
703+
704+
705+
=== TEST 20: ensure it does not mutate another module's main_conf (github issue #1553)
706+
https://github.com/openresty/lua-nginx-module/issues/1553
707+
--- stream_config
708+
init_worker_by_lua_block {
709+
return
710+
}
711+
--- stream_server_config
712+
content_by_lua_block {
713+
ngx.say("fake_var = ", ngx.var.fake_var)
714+
}
715+
--- stream_response
716+
fake_var = 1
717+
--- no_error_log
718+
[error]
719+
[alert]

t/data/fake-merge-module/config

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
ngx_addon_name=ngx_stream_fake_merge_module
2+
STREAM_MODULES="$STREAM_MODULES $ngx_addon_name"
3+
NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_stream_fake_merge_module.c"
Lines changed: 184 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,184 @@
1+
/*
2+
* This fake module was used to reproduce a bug in ngx_lua's init_worker_by_lua
3+
* implementation. The bug would cause this module's main_conf->a to be reset
4+
* to 0 due to init_worker_by_lua invoking merge_srv_conf with a brand new
5+
* srv_conf, whose a member would be 0.
6+
* The test case for this bug is in 124-init-worker.t.
7+
*/
8+
9+
10+
#include <ngx_config.h>
11+
#include <ngx_core.h>
12+
#include <ngx_stream.h>
13+
#include <nginx.h>
14+
15+
16+
typedef struct {
17+
ngx_flag_t a;
18+
} ngx_stream_fake_merge_main_conf_t;
19+
20+
21+
typedef struct {
22+
ngx_flag_t a;
23+
} ngx_stream_fake_merge_srv_conf_t;
24+
25+
26+
static ngx_int_t ngx_stream_fake_merge_var(ngx_stream_session_t *s,
27+
ngx_stream_variable_value_t *v, uintptr_t data);
28+
static ngx_int_t ngx_stream_fake_merge_add_variables(ngx_conf_t *cf);
29+
static ngx_int_t ngx_stream_fake_merge_init(ngx_conf_t *cf);
30+
static void *ngx_stream_fake_merge_create_main_conf(ngx_conf_t *cf);
31+
static void *ngx_stream_fake_merge_create_srv_conf(ngx_conf_t *cf);
32+
static char *ngx_stream_fake_merge_merge_srv_conf(ngx_conf_t *cf, void *prev,
33+
void *conf);
34+
35+
36+
static ngx_stream_module_t ngx_stream_fake_merge_module_ctx = {
37+
ngx_stream_fake_merge_init, /* preconfiguration */
38+
NULL, /* postconfiguration */
39+
40+
ngx_stream_fake_merge_create_main_conf, /* create main configuration */
41+
NULL, /* init main configuration */
42+
43+
ngx_stream_fake_merge_create_srv_conf, /* create server configuration */
44+
ngx_stream_fake_merge_merge_srv_conf, /* merge server configuration */
45+
};
46+
47+
48+
ngx_module_t ngx_stream_fake_merge_module = {
49+
NGX_MODULE_V1,
50+
&ngx_stream_fake_merge_module_ctx, /* module context */
51+
NULL, /* module directives */
52+
NGX_STREAM_MODULE, /* module type */
53+
NULL, /* init master */
54+
NULL, /* init module */
55+
NULL, /* init process */
56+
NULL, /* init thread */
57+
NULL, /* exit thread */
58+
NULL, /* exit process */
59+
NULL, /* exit master */
60+
NGX_MODULE_V1_PADDING
61+
};
62+
63+
64+
static ngx_stream_variable_t ngx_stream_fake_merge_variables[] = {
65+
66+
{ ngx_string("fake_var"), NULL,
67+
ngx_stream_fake_merge_var, 0,
68+
NGX_STREAM_VAR_NOCACHEABLE, 0 },
69+
70+
{ ngx_null_string, NULL, NULL, 0, 0, 0 }
71+
};
72+
73+
74+
static ngx_int_t
75+
ngx_stream_fake_merge_var(ngx_stream_session_t *s,
76+
ngx_stream_variable_value_t *v, uintptr_t data)
77+
{
78+
static char *str[] = {"0", "1"};
79+
ngx_stream_fake_merge_main_conf_t *fmcf;
80+
81+
fmcf = ngx_stream_get_module_main_conf(s, ngx_stream_fake_merge_module);
82+
if (fmcf == NULL) {
83+
return NGX_ERROR;
84+
}
85+
86+
v->len = 1;
87+
v->data = (u_char *) str[fmcf->a];
88+
v->valid = 1;
89+
v->no_cacheable = 0;
90+
v->not_found = 0;
91+
92+
return NGX_OK;
93+
}
94+
95+
96+
static ngx_int_t
97+
ngx_stream_fake_merge_add_variables(ngx_conf_t *cf)
98+
{
99+
ngx_stream_variable_t *var, *v;
100+
101+
for (v = ngx_stream_fake_merge_variables; v->name.len; v++) {
102+
var = ngx_stream_add_variable(cf, &v->name, v->flags);
103+
if (var == NULL) {
104+
return NGX_ERROR;
105+
}
106+
107+
var->get_handler = v->get_handler;
108+
var->data = v->data;
109+
}
110+
111+
return NGX_OK;
112+
}
113+
114+
115+
static ngx_int_t
116+
ngx_stream_fake_merge_init(ngx_conf_t *cf)
117+
{
118+
ngx_stream_fake_merge_srv_conf_t *fscf;
119+
120+
fscf = ngx_stream_conf_get_module_srv_conf(cf, ngx_stream_fake_merge_module);
121+
if (fscf == NULL) {
122+
return NGX_ERROR;
123+
}
124+
125+
if (ngx_stream_fake_merge_add_variables(cf) != NGX_OK) {
126+
return NGX_ERROR;
127+
}
128+
129+
fscf->a = 1;
130+
131+
return NGX_OK;
132+
}
133+
134+
135+
static void *
136+
ngx_stream_fake_merge_create_main_conf(ngx_conf_t *cf)
137+
{
138+
ngx_stream_fake_merge_main_conf_t *fmcf;
139+
140+
fmcf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_fake_merge_main_conf_t));
141+
if (fmcf == NULL) {
142+
return NULL;
143+
}
144+
145+
fmcf->a = NGX_CONF_UNSET;
146+
147+
return fmcf;
148+
}
149+
150+
151+
static void *
152+
ngx_stream_fake_merge_create_srv_conf(ngx_conf_t *cf)
153+
{
154+
ngx_stream_fake_merge_srv_conf_t *fscf;
155+
156+
fscf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_fake_merge_srv_conf_t));
157+
if (fscf == NULL) {
158+
return NULL;
159+
}
160+
161+
fscf->a = NGX_CONF_UNSET;
162+
163+
return fscf;
164+
}
165+
166+
167+
static char *
168+
ngx_stream_fake_merge_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)
169+
{
170+
ngx_stream_fake_merge_srv_conf_t *conf = child;
171+
ngx_stream_fake_merge_srv_conf_t *prev = parent;
172+
ngx_stream_fake_merge_main_conf_t *fmcf;
173+
174+
ngx_conf_merge_value(conf->a, prev->a, 0);
175+
176+
fmcf = ngx_stream_conf_get_module_main_conf(cf, ngx_stream_fake_merge_module);
177+
if (fmcf == NULL) {
178+
return NGX_CONF_ERROR;
179+
}
180+
181+
fmcf->a = conf->a;
182+
183+
return NGX_CONF_OK;
184+
}

util/build.sh

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ version=$1
1010
force=$2
1111
home=~
1212

13+
add_fake_merge_module="--add-module=$root/t/data/fake-merge-module"
14+
1315
#--add-module=$root/../stream-echo-nginx-module \
1416
ngx-build $force $version \
1517
--with-cc-opt="-DNGX_LUA_USE_ASSERT -I$PCRE_INC -I$OPENSSL_INC" \
@@ -33,6 +35,7 @@ ngx-build $force $version \
3335
--add-module=$root/../echo-nginx-module \
3436
--add-module=$root/../memc-nginx-module \
3537
--add-module=$root/../headers-more-nginx-module \
38+
$add_fake_merge_module \
3639
--add-module=$root $opts \
3740
--with-poll_module \
3841
--without-http_ssi_module \

0 commit comments

Comments
 (0)