diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2016-03-31 21:33:32 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2016-03-31 21:33:32 -0700 |
commit | c2c6c3c8c66855d9ccbe079015355ae8db8ff5e5 (patch) | |
tree | 379ebb7a4e9388d938b711256dba03d4c2d989a0 /socket.c | |
parent | c27f83bdae5eb00206a478f7764df4fdaa48fc76 (diff) | |
download | txr-c2c6c3c8c66855d9ccbe079015355ae8db8ff5e5.tar.gz txr-c2c6c3c8c66855d9ccbe079015355ae8db8ff5e5.tar.bz2 txr-c2c6c3c8c66855d9ccbe079015355ae8db8ff5e5.zip |
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.
Diffstat (limited to 'socket.c')
-rw-r--r-- | socket.c | 7 |
1 files changed, 5 insertions, 2 deletions
@@ -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 { |