Allow socket.listen on port 0 (#2152)

* Allow socket.listen on port 0

* Validate port string parsed from address

---------

Co-authored-by: byte.nop <byte.nop@gmail.com>
This commit is contained in:
nop
2026-05-12 12:50:01 +08:00
committed by GitHub
parent fe9f378a1a
commit abc11d7b6a

View File

@@ -7,6 +7,7 @@
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include <assert.h> #include <assert.h>
#include <errno.h>
#include <lua.h> #include <lua.h>
#include <lauxlib.h> #include <lauxlib.h>
@@ -411,6 +412,20 @@ lunpack(lua_State *L) {
return 4; return 4;
} }
static int
parse_port(lua_State *L, const char *s, const char *addr) {
errno = 0;
char *endptr;
unsigned long port = strtoul(s, &endptr, 10);
if (errno != 0 || endptr == s || *endptr != '\0' || port > UINT16_MAX) {
luaL_error(L, "Invalid port in address %s.", addr);
}
return (int)port;
}
static const char * static const char *
address_port(lua_State *L, char *tmp, const char * addr, int port_index, int *port) { address_port(lua_State *L, char *tmp, const char * addr, int port_index, int *port) {
const char * host; const char * host;
@@ -430,7 +445,7 @@ address_port(lua_State *L, char *tmp, const char * addr, int port_index, int *po
if (sep == NULL) { if (sep == NULL) {
luaL_error(L, "Invalid address %s.",addr); luaL_error(L, "Invalid address %s.",addr);
} }
*port = strtoul(sep+1,NULL,10); *port = parse_port(L, sep + 1, addr);
} else { } else {
// is ipv4 // is ipv4
const char * sep = strchr(addr,':'); const char * sep = strchr(addr,':');
@@ -440,7 +455,7 @@ address_port(lua_State *L, char *tmp, const char * addr, int port_index, int *po
memcpy(tmp, addr, sep-addr); memcpy(tmp, addr, sep-addr);
tmp[sep-addr] = '\0'; tmp[sep-addr] = '\0';
host = tmp; host = tmp;
*port = strtoul(sep+1,NULL,10); *port = parse_port(L, sep + 1, addr);
} }
} else { } else {
host = addr; host = addr;
@@ -489,9 +504,6 @@ llisten(lua_State *L) {
char tmp[sz]; char tmp[sz];
int port = 0; int port = 0;
const char * host = address_port(L, tmp, addr, 2, &port); const char * host = address_port(L, tmp, addr, 2, &port);
if (port == 0) {
return luaL_error(L, "Invalid port");
}
int backlog = luaL_optinteger(L,3,BACKLOG); int backlog = luaL_optinteger(L,3,BACKLOG);
struct skynet_context * ctx = lua_touserdata(L, lua_upvalueindex(1)); struct skynet_context * ctx = lua_touserdata(L, lua_upvalueindex(1));
int id = skynet_socket_listen(ctx, host,port,backlog); int id = skynet_socket_listen(ctx, host,port,backlog);