From c2c6c3c8c66855d9ccbe079015355ae8db8ff5e5 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Thu, 31 Mar 2016 21:33:32 -0700 Subject: Bugfix: support abstract UNIX socket addresses on Linux. Making it work as already documented. * socket.c (MIN): New macro. (sockaddr_pack): Use utf8_dup_to_buf to convert Unix socket path to a buffer of UTF-8 bytes, possibly with one or more embedded null bytes. Copy as much of this as fits into the sun_path member of struct sockaddr_un. * txr.1: Improve documentation about the abstract names on Linux. --- socket.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'socket.c') diff --git a/socket.c b/socket.c index 39c4d931..e90d374e 100644 --- a/socket.c +++ b/socket.c @@ -51,6 +51,8 @@ #include "arith.h" #include "socket.h" +#define MIN(A, B) ((A) < (B) ? (A) : (B)) + struct dgram_stream { struct strm_base a; val stream; @@ -244,11 +246,12 @@ static void sockaddr_pack(val sockaddr, val family, *len = sizeof *sa; } else if (addr_type == sockaddr_un_s) { val path = slot(sockaddr, path_s); - char *path_u8 = utf8_dup_to(c_str(path)); struct sockaddr_un *sa = coerce(struct sockaddr_un *, buf); + size_t size; + unsigned char *path_u8 = utf8_dup_to_buf(c_str(path), &size, 0); memset(sa, 0, sizeof *sa); sa->sun_family = AF_UNIX; - strncpy(sa->sun_path, path_u8, sizeof sa->sun_path - 1); + memcpy(sa->sun_path, path_u8, MIN(size, sizeof sa->sun_path)); free(path_u8); *len = sizeof *sa; } else { -- cgit v1.2.3