diff options
-rw-r--r-- | src/libutil/addr.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/src/libutil/addr.c b/src/libutil/addr.c index 4c3de70cf..71879e357 100644 --- a/src/libutil/addr.c +++ b/src/libutil/addr.c @@ -1680,7 +1680,8 @@ rspamd_inet_address_from_sa (const struct sockaddr *sa, socklen_t slen) rspamd_inet_addr_t *addr; g_assert (sa != NULL); - g_assert (slen >= sizeof (struct sockaddr)); + /* Address of an AF_UNIX socket can be tiny */ + g_assert (slen >= sizeof (sa_family_t) + 1); addr = rspamd_inet_addr_create (sa->sa_family, NULL); @@ -1689,12 +1690,13 @@ rspamd_inet_address_from_sa (const struct sockaddr *sa, socklen_t slen) const struct sockaddr_un *un = (const struct sockaddr_un *)sa; g_assert (slen >= SUN_LEN (un)); + g_assert (slen <= sizeof (addr->u.un->addr)); - rspamd_strlcpy (addr->u.un->addr.sun_path, un->sun_path, - sizeof (addr->u.un->addr.sun_path)); -#if defined(FREEBSD) || defined(__APPLE__) - addr->u.un->addr.sun_len = un->sun_len; -#endif + /* sun_path can legally contain intermittent NULL bytes */ + memcpy (&addr->u.un->addr, un, slen); + + /* length of AF_UNIX addresses is variable */ + addr->slen = slen; } else if (sa->sa_family == AF_INET) { g_assert (slen >= sizeof (struct sockaddr_in)); |