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);