Account for abstract namespace names
From lua_tostring to lua_tolstring since the names can start with null for namespaces.
This commit is contained in:
parent
c89a931cc3
commit
e92c1526bf
1 changed files with 18 additions and 17 deletions
|
@ -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 pathlen);
|
||||
static const char *unixstream_trybind(p_unix un, const char *path, size_t pathlen);
|
||||
|
||||
/* unixstream object methods */
|
||||
static luaL_Reg unixstream_methods[] = {
|
||||
|
@ -181,13 +181,12 @@ 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 pathlen) {
|
||||
struct sockaddr_un local;
|
||||
size_t len = strlen(path);
|
||||
int err;
|
||||
if (len >= sizeof(local.sun_path)) return "path too long";
|
||||
if (pathlen >= sizeof(local.sun_path)) return "path too long";
|
||||
memset(&local, 0, sizeof(local));
|
||||
strcpy(local.sun_path, path);
|
||||
memcpy(local.sun_path, path, pathlen);
|
||||
local.sun_family = AF_UNIX;
|
||||
#ifdef UNIX_HAS_SUN_LEN
|
||||
local.sun_len = sizeof(local.sun_family) + sizeof(local.sun_len)
|
||||
|
@ -196,7 +195,7 @@ static const char *unixstream_trybind(p_unix un, const char *path) {
|
|||
|
||||
#else
|
||||
err = socket_bind(&un->sock, (SA *) &local,
|
||||
sizeof(local.sun_family) + len);
|
||||
sizeof(local.sun_family) + pathlen);
|
||||
#endif
|
||||
if (err != IO_DONE) socket_destroy(&un->sock);
|
||||
return socket_strerror(err);
|
||||
|
@ -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 = 0;
|
||||
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,23 +234,22 @@ 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 pathlen)
|
||||
{
|
||||
struct sockaddr_un remote;
|
||||
int err;
|
||||
size_t len = strlen(path);
|
||||
if (len >= sizeof(remote.sun_path)) return "path too long";
|
||||
if (pathlen >= sizeof(remote.sun_path)) return "path too long";
|
||||
memset(&remote, 0, sizeof(remote));
|
||||
strcpy(remote.sun_path, path);
|
||||
memcpy(remote.sun_path, path, pathlen);
|
||||
remote.sun_family = AF_UNIX;
|
||||
timeout_markstart(&un->tm);
|
||||
#ifdef UNIX_HAS_SUN_LEN
|
||||
remote.sun_len = sizeof(remote.sun_family) + sizeof(remote.sun_len)
|
||||
+ len + 1;
|
||||
+ pathlen + 1;
|
||||
err = socket_connect(&un->sock, (SA *) &remote, remote.sun_len, &un->tm);
|
||||
#else
|
||||
err = socket_connect(&un->sock, (SA *) &remote,
|
||||
sizeof(remote.sun_family) + len, &un->tm);
|
||||
sizeof(remote.sun_family) + pathlen, &un->tm);
|
||||
#endif
|
||||
if (err != IO_DONE) socket_destroy(&un->sock);
|
||||
return socket_strerror(err);
|
||||
|
@ -259,8 +258,10 @@ 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 = 0;
|
||||
|
||||
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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue