From 81a3d0a8e6e0122f5ef4583a3778cc1883a26e64 Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Sat, 27 Apr 2024 17:37:24 +0200 Subject: [PATCH] fix(unix): Pass correct path length for abstract sockets Since they start with NUL byte, strlen() does the wrong thing. The Lua API can already pass the real string length, so passing that on seems the sensible thing to do. Fixes #216 --- src/unixdgram.c | 20 ++++++++++---------- src/unixstream.c | 20 ++++++++++---------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/unixdgram.c b/src/unixdgram.c index 69093d73..16bb113c 100644 --- a/src/unixdgram.c +++ b/src/unixdgram.c @@ -42,8 +42,8 @@ static int meth_receivefrom(lua_State *L); static int meth_sendto(lua_State *L); static int meth_getsockname(lua_State *L); -static const char *unixdgram_tryconnect(p_unix un, const char *path); -static const char *unixdgram_trybind(p_unix un, const char *path); +static const char *unixdgram_tryconnect(p_unix un, const char *path, size_t len); +static const char *unixdgram_trybind(p_unix un, const char *path, size_t len); /* unixdgram object methods */ static luaL_Reg unixdgram_methods[] = { @@ -264,9 +264,8 @@ static int meth_dirty(lua_State *L) { /*-------------------------------------------------------------------------*\ * Binds an object to an address \*-------------------------------------------------------------------------*/ -static const char *unixdgram_trybind(p_unix un, const char *path) { +static const char *unixdgram_trybind(p_unix un, const char *path, size_t len) { struct sockaddr_un local; - size_t len = strlen(path); if (len >= sizeof(local.sun_path)) return "path too long"; memset(&local, 0, sizeof(local)); strcpy(local.sun_path, path); @@ -283,8 +282,9 @@ static const char *unixdgram_trybind(p_unix un, const char *path) { static int meth_bind(lua_State *L) { p_unix un = (p_unix) auxiliar_checkclass(L, "unixdgram{unconnected}", 1); - const char *path = luaL_checkstring(L, 2); - const char *err = unixdgram_trybind(un, path); + size_t len; + const char *path = luaL_checklstring(L, 2, &len); + const char *err = unixdgram_trybind(un, path, len); if (err) { lua_pushnil(L); lua_pushstring(L, err); @@ -313,10 +313,9 @@ static int meth_getsockname(lua_State *L) /*-------------------------------------------------------------------------*\ * Turns a master unixdgram object into a client object. \*-------------------------------------------------------------------------*/ -static const char *unixdgram_tryconnect(p_unix un, const char *path) +static const char *unixdgram_tryconnect(p_unix un, const char *path, size_t len) { struct sockaddr_un remote; - size_t len = strlen(path); if (len >= sizeof(remote.sun_path)) return "path too long"; memset(&remote, 0, sizeof(remote)); strcpy(remote.sun_path, path); @@ -334,8 +333,9 @@ static const char *unixdgram_tryconnect(p_unix un, const char *path) static int meth_connect(lua_State *L) { p_unix un = (p_unix) auxiliar_checkgroup(L, "unixdgram{any}", 1); - const char *path = luaL_checkstring(L, 2); - const char *err = unixdgram_tryconnect(un, path); + size_t len; + const char *path = luaL_checklstring(L, 2, &len); + const char *err = unixdgram_tryconnect(un, path, len); if (err) { lua_pushnil(L); lua_pushstring(L, err); diff --git a/src/unixstream.c b/src/unixstream.c index 02aced9c..0d726283 100644 --- a/src/unixstream.c +++ b/src/unixstream.c @@ -33,8 +33,8 @@ static int meth_getstats(lua_State *L); static int meth_setstats(lua_State *L); static int meth_getsockname(lua_State *L); -static const char *unixstream_tryconnect(p_unix un, const char *path); -static const char *unixstream_trybind(p_unix un, const char *path); +static const char *unixstream_tryconnect(p_unix un, const char *path, size_t len); +static const char *unixstream_trybind(p_unix un, const char *path, size_t len); /* unixstream object methods */ static luaL_Reg unixstream_methods[] = { @@ -181,9 +181,8 @@ static int meth_accept(lua_State *L) { /*-------------------------------------------------------------------------*\ * Binds an object to an address \*-------------------------------------------------------------------------*/ -static const char *unixstream_trybind(p_unix un, const char *path) { +static const char *unixstream_trybind(p_unix un, const char *path, size_t len) { struct sockaddr_un local; - size_t len = strlen(path); int err; if (len >= sizeof(local.sun_path)) return "path too long"; memset(&local, 0, sizeof(local)); @@ -204,8 +203,9 @@ static const char *unixstream_trybind(p_unix un, const char *path) { static int meth_bind(lua_State *L) { p_unix un = (p_unix) auxiliar_checkclass(L, "unixstream{master}", 1); - const char *path = luaL_checkstring(L, 2); - const char *err = unixstream_trybind(un, path); + size_t len; + const char *path = luaL_checklstring(L, 2, &len); + const char *err = unixstream_trybind(un, path, len); if (err) { lua_pushnil(L); lua_pushstring(L, err); @@ -234,11 +234,10 @@ static int meth_getsockname(lua_State *L) /*-------------------------------------------------------------------------*\ * Turns a master unixstream object into a client object. \*-------------------------------------------------------------------------*/ -static const char *unixstream_tryconnect(p_unix un, const char *path) +static const char *unixstream_tryconnect(p_unix un, const char *path, size_t len) { struct sockaddr_un remote; int err; - size_t len = strlen(path); if (len >= sizeof(remote.sun_path)) return "path too long"; memset(&remote, 0, sizeof(remote)); strcpy(remote.sun_path, path); @@ -259,8 +258,9 @@ static const char *unixstream_tryconnect(p_unix un, const char *path) static int meth_connect(lua_State *L) { p_unix un = (p_unix) auxiliar_checkclass(L, "unixstream{master}", 1); - const char *path = luaL_checkstring(L, 2); - const char *err = unixstream_tryconnect(un, path); + size_t len; + const char *path = luaL_checklstring(L, 2, &len); + const char *err = unixstream_tryconnect(un, path, len); if (err) { lua_pushnil(L); lua_pushstring(L, err);