X-Git-Url: https://git.archive.openwrt.org/?p=project%2Fluci.git;a=blobdiff_plain;f=libs%2Fnixio%2Fsrc%2Fio.c;h=12d5c7df4529661b9869ebbd0e514a255e5d6331;hp=1d8f4484c6d72f590640b2861099233412ed35fa;hb=ca7bc48ebc0b1f655088eaae89bd358556dc8824;hpb=5c1ef9a0a60240a949be9ce1839c049471d7c5a1 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