@@ -262,11 +262,12 @@ ngx_stream_lua_socket_udp_bind(lua_State *L)
262262 u_char * text ;
263263 size_t len ;
264264 ngx_addr_t * local ;
265+ ngx_int_t port = 0 ;
265266
266267 ngx_stream_lua_request_t * r ;
267268
268269 n = lua_gettop (L );
269- if (n != 2 ) {
270+ if (n != 2 && n != 3 ) {
270271 return luaL_error (L , "expecting 2 arguments, but got %d" ,
271272 lua_gettop (L ));
272273 }
@@ -286,7 +287,13 @@ ngx_stream_lua_socket_udp_bind(lua_State *L)
286287 luaL_checktype (L , 1 , LUA_TTABLE );
287288
288289 text = (u_char * ) luaL_checklstring (L , 2 , & len );
289- local = ngx_stream_lua_parse_addr (L , text , len );
290+ if (n == 3 ) {
291+ port = luaL_checkinteger (L , 3 );
292+ if (port <= 0 || port > 65535 )
293+ return luaL_error (L , "bad port number: %d" , port );
294+ }
295+
296+ local = ngx_stream_lua_parse_addr (L , text , len , port );
290297 if (local == NULL ) {
291298 lua_pushnil (L );
292299 lua_pushfstring (L , "bad address" );
@@ -499,6 +506,7 @@ ngx_stream_lua_socket_udp_setpeername(lua_State *L)
499506 u -> resolved -> socklen = url .addrs [0 ].socklen ;
500507 u -> resolved -> naddrs = 1 ;
501508 u -> resolved -> host = url .addrs [0 ].name ;
509+ u -> resolved -> port = ngx_inet_get_port (url .addrs [0 ].sockaddr );
502510
503511 } else {
504512 u -> resolved -> host = host ;
@@ -1640,7 +1648,7 @@ ngx_stream_lua_udp_connect_set_transparent(ngx_stream_lua_udp_connection_t *uc,
16401648
16411649#endif /* SO_BINDANY */
16421650
1643- return NGX_OK ;
1651+ return NGX_OK ;
16441652}
16451653#endif
16461654
@@ -1742,7 +1750,7 @@ ngx_stream_lua_udp_connect(ngx_stream_lua_socket_udp_upstream_t *u)
17421750#endif
17431751
17441752#if (NGX_HAVE_IP_BIND_ADDRESS_NO_PORT || NGX_LINUX )
1745- port = u -> resolved -> port ;
1753+ port = ngx_inet_get_port ( local -> sockaddr ) ;
17461754#endif
17471755
17481756#if (NGX_HAVE_IP_BIND_ADDRESS_NO_PORT )
0 commit comments