Skip to content

Commit 97fbeb0

Browse files
committed
bugfix: the ssl connections might be drained and reused prematurely when ssl_certificate_by_lua* or ssl_session_fetch_by_lua* were used. this might lead to segmentation faults under load. thanks guanglinlv for the report and the original patch in openresty#1162.
1 parent bf14723 commit 97fbeb0

6 files changed

+35
-12
lines changed

src/ngx_http_lua_ssl_certby.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,8 @@ ngx_http_lua_ssl_cert_handler(ngx_ssl_conn_t *ssl_conn, void *data)
197197

198198
c = ngx_ssl_get_connection(ssl_conn);
199199

200-
dd("c = %p", c);
200+
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
201+
"ssl cert: connection reusable: %ud", c->reusable);
201202

202203
cctx = ngx_http_lua_ssl_get_ctx(c->ssl->connection);
203204

@@ -220,6 +221,8 @@ ngx_http_lua_ssl_cert_handler(ngx_ssl_conn_t *ssl_conn, void *data)
220221

221222
dd("first time");
222223

224+
ngx_reusable_connection(c, 0);
225+
223226
hc = c->data;
224227

225228
fc = ngx_http_lua_create_fake_connection(NULL);

src/ngx_http_lua_ssl_session_fetchby.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,8 @@ ngx_http_lua_ssl_sess_fetch_handler(ngx_ssl_conn_t *ssl_conn, u_char *id,
191191

192192
c = ngx_ssl_get_connection(ssl_conn);
193193

194-
dd("c = %p", c);
194+
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
195+
"ssl session fetch: connection reusable: %ud", c->reusable);
195196

196197
cctx = ngx_http_lua_ssl_get_ctx(c->ssl->connection);
197198

@@ -224,6 +225,8 @@ ngx_http_lua_ssl_sess_fetch_handler(ngx_ssl_conn_t *ssl_conn, u_char *id,
224225

225226
dd("first time");
226227

228+
ngx_reusable_connection(c, 0);
229+
227230
hc = c->data;
228231

229232
fc = ngx_http_lua_create_fake_connection(NULL);

src/ngx_http_lua_ssl_session_storeby.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,8 @@ ngx_http_lua_ssl_sess_store_handler(ngx_ssl_conn_t *ssl_conn,
183183

184184
c = ngx_ssl_get_connection(ssl_conn);
185185

186-
dd("c = %p", c);
186+
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
187+
"ssl session store: connection reusable: %ud", c->reusable);
187188

188189
cctx = ngx_http_lua_ssl_get_ctx(c->ssl->connection);
189190

t/139-ssl-cert-by.t

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,11 +113,17 @@ close: 1 nil
113113

114114
--- error_log
115115
lua ssl server name: "test.com"
116-
ssl_certificate_by_lua:1: ssl cert by lua is running!
117116

118117
--- no_error_log
119118
[error]
120119
[alert]
120+
--- grep_error_log eval: qr/ssl_certificate_by_lua:.*?,|\bssl cert: connection reusable: \d+|\breusable connection: \d+/
121+
--- grep_error_log_out eval
122+
qr/reusable connection: 1
123+
ssl cert: connection reusable: 1
124+
reusable connection: 0
125+
ssl_certificate_by_lua:1: ssl cert by lua is running!,
126+
/
121127

122128

123129

t/142-ssl-session-store.t

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,11 +82,16 @@ close: 1 nil
8282
8383
--- error_log
8484
lua ssl server name: "test.com"
85-
ssl_session_store_by_lua_block:1: ssl session store by lua is running!
8685
8786
--- no_error_log
8887
[error]
8988
[alert]
89+
--- grep_error_log eval: qr/ssl_session_store_by_lua_block:.*?,|\bssl session store: connection reusable: \d+|\breusable connection: \d+/
90+
--- grep_error_log_out eval
91+
qr/^reusable connection: 0
92+
ssl session store: connection reusable: 0
93+
ssl_session_store_by_lua_block:1: ssl session store by lua is running!,
94+
/m,
9095
9196
9297

t/143-ssl-session-fetch.t

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -83,16 +83,21 @@ connected: 1
8383
ssl handshake: userdata
8484
close: 1 nil
8585
86-
--- grep_error_log eval
87-
qr/ssl_session_fetch_by_lua_block:1: ssl fetch sess by lua is running!/s
86+
--- grep_error_log eval: qr/ssl_session_fetch_by_lua_block:.*?,|\bssl session fetch: connection reusable: \d+|\breusable connection: \d+/
8887
8988
--- grep_error_log_out eval
9089
[
91-
'',
92-
'ssl_session_fetch_by_lua_block:1: ssl fetch sess by lua is running!
93-
',
94-
'ssl_session_fetch_by_lua_block:1: ssl fetch sess by lua is running!
95-
',
90+
qr/\A(?:reusable connection: [01]\n)+\z/s,
91+
qr/^reusable connection: 1
92+
ssl session fetch: connection reusable: 1
93+
reusable connection: 0
94+
ssl_session_fetch_by_lua_block:1: ssl fetch sess by lua is running!,
95+
/m,
96+
qr/^reusable connection: 1
97+
ssl session fetch: connection reusable: 1
98+
reusable connection: 0
99+
ssl_session_fetch_by_lua_block:1: ssl fetch sess by lua is running!,
100+
/m,
96101
]
97102
98103
--- no_error_log

0 commit comments

Comments
 (0)