Skip to content

Commit c226a00

Browse files
committed
bugfix: balancer_by_lua* might crash the nginx worker when SSL (https) is used for upstream connections. thanks Alistair Wooldrige for the report in openresty#696.
1 parent e9b4371 commit c226a00

File tree

1 file changed

+43
-4
lines changed

1 file changed

+43
-4
lines changed

src/ngx_http_lua_balancer.c

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,6 @@ struct ngx_http_lua_balancer_peer_data_s {
2323
ngx_http_lua_srv_conf_t *conf;
2424
ngx_http_request_t *request;
2525

26-
ngx_event_get_peer_pt get_rr_peer;
27-
2826
ngx_uint_t more_tries;
2927
ngx_uint_t total_tries;
3028

@@ -38,6 +36,10 @@ struct ngx_http_lua_balancer_peer_data_s {
3836
};
3937

4038

39+
static ngx_int_t ngx_http_lua_balancer_set_session(ngx_peer_connection_t *pc,
40+
void *data);
41+
static void ngx_http_lua_balancer_save_session(ngx_peer_connection_t *pc,
42+
void *data);
4143
static ngx_int_t ngx_http_lua_balancer_init(ngx_conf_t *cf,
4244
ngx_http_upstream_srv_conf_t *us);
4345
static ngx_int_t ngx_http_lua_balancer_init_peer(ngx_http_request_t *r,
@@ -232,10 +234,14 @@ ngx_http_lua_balancer_init_peer(ngx_http_request_t *r,
232234
r->upstream->peer.get = ngx_http_lua_balancer_get_peer;
233235
r->upstream->peer.free = ngx_http_lua_balancer_free_peer;
234236

237+
#if (NGX_HTTP_SSL)
238+
r->upstream->peer.set_session = ngx_http_lua_balancer_set_session;
239+
r->upstream->peer.save_session = ngx_http_lua_balancer_save_session;
240+
#endif
241+
235242
bcf = ngx_http_conf_upstream_srv_conf(us, ngx_http_lua_module);
236243

237244
bp->conf = bcf;
238-
bp->get_rr_peer = ngx_http_upstream_get_round_robin_peer;
239245
bp->request = r;
240246

241247
return NGX_OK;
@@ -329,7 +335,7 @@ ngx_http_lua_balancer_get_peer(ngx_peer_connection_t *pc, void *data)
329335
return NGX_OK;
330336
}
331337

332-
return bp->get_rr_peer(pc, &bp->rrp);
338+
return ngx_http_upstream_get_round_robin_peer(pc, &bp->rrp);
333339
}
334340

335341

@@ -410,6 +416,39 @@ ngx_http_lua_balancer_free_peer(ngx_peer_connection_t *pc, void *data,
410416
}
411417

412418

419+
#if (NGX_HTTP_SSL)
420+
421+
static ngx_int_t
422+
ngx_http_lua_balancer_set_session(ngx_peer_connection_t *pc, void *data)
423+
{
424+
ngx_http_lua_balancer_peer_data_t *bp = data;
425+
426+
if (bp->sockaddr && bp->socklen) {
427+
/* TODO */
428+
return NGX_OK;
429+
}
430+
431+
return ngx_http_upstream_set_round_robin_peer_session(pc, &bp->rrp);
432+
}
433+
434+
435+
static void
436+
ngx_http_lua_balancer_save_session(ngx_peer_connection_t *pc, void *data)
437+
{
438+
ngx_http_lua_balancer_peer_data_t *bp = data;
439+
440+
if (bp->sockaddr && bp->socklen) {
441+
/* TODO */
442+
return;
443+
}
444+
445+
ngx_http_upstream_save_round_robin_peer_session(pc, &bp->rrp);
446+
return;
447+
}
448+
449+
#endif
450+
451+
413452
#ifndef NGX_LUA_NO_FFI_API
414453

415454
int

0 commit comments

Comments
 (0)