summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--libs/nixio/src/bind.c10
-rw-r--r--libs/nixio/src/io.c12
2 files changed, 13 insertions, 9 deletions
diff --git a/libs/nixio/src/bind.c b/libs/nixio/src/bind.c
index 711205955..68e1df8a8 100644
--- a/libs/nixio/src/bind.c
+++ b/libs/nixio/src/bind.c
@@ -193,15 +193,15 @@ static int nixio_sock__bind_connect(lua_State *L, int do_bind) {
struct sockaddr_un addr;
addr.sun_family = AF_UNIX;
- luaL_argcheck(L, pathlen < sizeof(addr.sun_path), 2, "out of range");
- strncpy(addr.sun_path, path, sizeof(addr.sun_path));
+ luaL_argcheck(L, pathlen <= sizeof(addr.sun_path), 2, "out of range");
+ memcpy(addr.sun_path, path, pathlen);
+ socklen_t alen = sizeof(sa_family_t) + pathlen;
if (do_bind) {
- status = bind(sock->fd, (struct sockaddr*)&addr, sizeof(addr));
+ status = bind(sock->fd, (struct sockaddr*)&addr, alen);
} else {
do {
- status = connect(sock->fd, (struct sockaddr*)&addr,
- sizeof(addr));
+ status = connect(sock->fd, (struct sockaddr*)&addr, alen);
} while (status == -1 && errno == EINTR);
}
#endif
diff --git a/libs/nixio/src/io.c b/libs/nixio/src/io.c
index 1d8f4484c..12d5c7df4 100644
--- a/libs/nixio/src/io.c
+++ b/libs/nixio/src/io.c
@@ -61,11 +61,11 @@ static int nixio_sock__sendto(lua_State *L, int to) {
const char *path = luaL_checklstring(L, 3, &pathlen);
addr_un.sun_family = AF_UNIX;
- luaL_argcheck(L, pathlen < sizeof(addr_un.sun_path), 3, "out of range");
- strncpy(addr_un.sun_path, path, sizeof(addr_un.sun_path));
+ luaL_argcheck(L, pathlen <= sizeof(addr_un.sun_path), 3, "out of range");
+ memcpy(addr_un.sun_path, path, pathlen);
addr = (struct sockaddr*)&addr_un;
- alen = sizeof(addr_un);
+ alen = sizeof(sa_family_t) + pathlen;
}
#endif
}
@@ -180,7 +180,11 @@ static int nixio_sock__recvfrom(lua_State *L, int from) {
}
#ifndef __WINNT__
else if (sock->domain == AF_UNIX && alen > sizeof(sa_family_t)) {
- lua_pushstring(L, addr_un.sun_path);
+ /* if first char is non-null then the path is not in the
+ abstract namespace and alen includes the trailing null */
+ if (addr_un.sun_path[0])
+ --alen;
+ lua_pushlstring(L, addr_un.sun_path, alen - sizeof(sa_family_t));
return 2;
}
#endif