From 06b3993001b2780df91b2e0584afcc61035ed32c Mon Sep 17 00:00:00 2001 From: gresham Date: Thu, 28 May 2026 20:17:12 +0800 Subject: [PATCH 1/2] bugfix: parse_addr should use INADDR_ANY for "0.0.0.0", not INADDR_NONE. The special-case for "0.0.0.0" introduced in e50520b assigned INADDR_NONE (0xFFFFFFFF = 255.255.255.255) to sin_addr.s_addr, causing tcpsock:bind('0.0.0.0') / UDP cosocket binds to fail with EADDRNOTAVAIL because the broadcast address was written into the sockaddr instead of the wildcard. Use INADDR_ANY (0). Co-Authored-By: Claude Opus 4.7 (1M context) --- src/ngx_stream_lua_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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; From 00560a804fadc31760e7b988c53dd5a60c0d6b53 Mon Sep 17 00:00:00 2001 From: gresham Date: Thu, 28 May 2026 20:20:39 +0800 Subject: [PATCH 2/2] tests: cover tcpsock/udpsock bind("0.0.0.0") wildcard regression. Regression tests for the INADDR_NONE/INADDR_ANY mix-up in ngx_stream_lua_parse_addr: bind("0.0.0.0") must succeed and resolve to the wildcard address rather than 255.255.255.255. Co-Authored-By: Claude Opus 4.7 (1M context) --- t/141-tcp-socket-bind.t | 39 +++++++++++++++++++++++++++++++++++++++ t/142-udp-socket-bind.t | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+) 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