From 63f4b78353a41773ad8542dc9c201598b58c3473 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20B=C3=BChler?= Date: Tue, 15 Apr 2014 12:06:11 +0200 Subject: [PATCH] fix some socket address handlings - limit unix socket path names to struct size --- src/common/utils.c | 16 ++++++++-------- src/main/server.c | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/common/utils.c b/src/common/utils.c index 8230c68..eeb3ba9 100644 --- a/src/common/utils.c +++ b/src/common/utils.c @@ -651,12 +651,12 @@ liSocketAddress li_sockaddr_from_string(const GString *str, guint tcp_default_po #ifdef HAVE_SYS_UN_H if (0 == strncmp(str->str, "unix:/", 6)) { - /* try to support larger unix socket names than what fits in the default sockaddr_un struct */ - saddr.len = str->len + 1 - 5 + sizeof(saddr.addr->un) - sizeof(saddr.addr->un.sun_path); - if (saddr.len < sizeof(saddr.addr->un)) saddr.len = sizeof(saddr.addr->un); - saddr.addr = (liSockAddr*) g_slice_alloc0(saddr.len); - saddr.addr->un.sun_family = AF_UNIX; - strcpy(saddr.addr->un.sun_path, str->str + 5); + if (str->len + 1 - 5 <= sizeof(saddr.addr->un.sun_path)) { + saddr.len = sizeof(saddr.addr->un); + saddr.addr = (liSockAddr*) g_slice_alloc0(saddr.len); + saddr.addr->un.sun_family = AF_UNIX; + memcpy(saddr.addr->un.sun_path, str->str + 5, str->len + 1 - 5); + } } else #endif if (li_parse_ipv4(str->str, &ipv4, NULL, &port)) { @@ -692,7 +692,7 @@ liSocketAddress li_sockaddr_local_from_socket(gint fd) { saddr.addr = (liSockAddr*) g_slice_alloc0(l); saddr.len = l; if (l <= sizeof(sa)) { - memcpy(saddr.addr, &sa.plain, l); + memcpy(saddr.addr, &sa, l); } else { if (-1 == getsockname(fd, (struct sockaddr*) saddr.addr, &l)) { li_sockaddr_clear(&saddr); @@ -714,7 +714,7 @@ liSocketAddress li_sockaddr_remote_from_socket(gint fd) { saddr.addr = (liSockAddr*) g_slice_alloc0(l); saddr.len = l; if (l <= sizeof(sa)) { - memcpy(saddr.addr, &sa.plain, l); + memcpy(saddr.addr, &sa, l); } else { if (-1 == getpeername(fd, (struct sockaddr*) saddr.addr, &l)) { li_sockaddr_clear(&saddr); diff --git a/src/main/server.c b/src/main/server.c index ad65b99..728df66 100644 --- a/src/main/server.c +++ b/src/main/server.c @@ -419,7 +419,7 @@ static void li_server_listen_cb(liEventBase *watcher, int events) { if (l <= sizeof(sa)) { remote_addr.addr = g_slice_alloc(l); remote_addr.len = l; - memcpy(remote_addr.addr, &sa.plain, l); + memcpy(remote_addr.addr, &sa, l); } else { remote_addr = li_sockaddr_remote_from_socket(s); }