diff --git a/src/ngx_stream_lua_util.c b/src/ngx_stream_lua_util.c index 8c996658..f874480d 100644 --- a/src/ngx_stream_lua_util.c +++ b/src/ngx_stream_lua_util.c @@ -3720,7 +3720,7 @@ ngx_stream_lua_parse_addr(lua_State *L, u_char *text, size_t len, #endif if (len == 7 && memcmp(text, "0.0.0.0", 7) == 0) { - inaddr = INADDR_NONE; + inaddr = INADDR_ANY; socklen = sizeof(struct sockaddr_in); family = AF_INET; diff --git a/t/141-tcp-socket-bind.t b/t/141-tcp-socket-bind.t index c4119e36..5b4b623e 100644 --- a/t/141-tcp-socket-bind.t +++ b/t/141-tcp-socket-bind.t @@ -224,3 +224,42 @@ server { 127.0.0.1 --- no_error_log [error] + + + +=== TEST 6: upstream sockets bind 0.0.0.0 (wildcard, regression for INADDR_NONE bug) +--- stream_config +server { + listen 127.0.1.2:2986; + content_by_lua_block { + ngx.say(ngx.var.remote_addr) + } +} +--- stream_server_config + content_by_lua_block { + local sock = ngx.socket.tcp() + + local ok, err = sock:bind("0.0.0.0") + if not ok then + ngx.log(ngx.ERR, "bind failed: ", err) + return + end + + local ok, err = sock:connect("127.0.1.2", 2986) + if not ok then + ngx.log(ngx.ERR, "connect failed: ", err) + return + end + + local line, err, part = sock:receive() + if line then + ngx.say(line) + else + ngx.log(ngx.ERR, err) + end + } + +--- stream_response +127.0.0.1 +--- no_error_log +[error] diff --git a/t/142-udp-socket-bind.t b/t/142-udp-socket-bind.t index e5dce000..1aef6ef3 100644 --- a/t/142-udp-socket-bind.t +++ b/t/142-udp-socket-bind.t @@ -272,3 +272,40 @@ server { --- no_error_log [error] + + + +=== TEST 6: upstream sockets bind 0.0.0.0 (wildcard, regression for INADDR_NONE bug) +--- stream_config +server { + listen 127.0.1.2:2986 udp; + content_by_lua_block { + ngx.log(ngx.INFO, "udp bind address: " .. ngx.var.remote_addr) + } +} +--- stream_server_config + content_by_lua_block { + local sock = ngx.socket.udp() + + local ok, err = sock:bind("0.0.0.0") + if not ok then + ngx.log(ngx.ERR, "bind failed: ", err) + return + end + + local ok, err = sock:setpeername("127.0.1.2", 2986) + if not ok then + ngx.log(ngx.ERR, "setpeername failed: ", err) + return + end + + local ok, err = sock:send("trigger") + if not ok then + ngx.log(ngx.ERR, err) + end + } + +--- no_error_log +[error] +--- error_log +udp bind address: 127.0.0.1