From 7fcde5aedf5e9dbd551055e486ae58810a5d0d72 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Pawe=C5=82=20Szewczyk?= Date: Thu, 10 May 2018 14:08:50 +0200 Subject: [PATCH] Handle IPv4-mapped adresses MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit With systemd socket activation we may get IPv6 socket. Here it is assumed that it has IPv4-mapped address, which is passed to verification function. Change-Id: I7d508db49f2ec437c9937fe81579fb44cb267dd0 Signed-off-by: Paweł Szewczyk --- src/transport_local.c | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/transport_local.c b/src/transport_local.c index ab307d5..294a365 100644 --- a/src/transport_local.c +++ b/src/transport_local.c @@ -146,9 +146,12 @@ static void *client_socket_thread(void *x) static void *server_socket_thread(void * arg) { int serverfd, fd; - struct sockaddr_in addr; socklen_t alen; int port = (intptr_t)arg; + const char *addr_str; + struct sockaddr_storage addr; + struct sockaddr_in *addr_v4; + struct sockaddr_in6 *addr_v6; D("transport: server_socket_thread() starting\n"); serverfd = sdb_port_get_tcp_listenfd(); @@ -182,9 +185,24 @@ static void *server_socket_thread(void * arg) } disable_tcp_nagle(fd); + if (addr.ss_family == AF_INET) { + addr_v4 = (struct sockaddr_in *)(&addr); + addr_str = inet_ntoa(addr_v4->sin_addr); + D("IPv4 connection (addr %s)\n", addr_str); + } else if (addr.ss_family == AF_INET6) { + struct in_addr in; + addr_v6 = (struct sockaddr_in6 *)(&addr); + memcpy(&in, addr_v6->sin6_addr.s6_addr + 12, sizeof(in)); + addr_str = inet_ntoa(in); + D("IPv6 connection, mapped IPv4 addr: %s\n", addr_str); + } else { + D("Unknown socket family %d\n", addr.ss_family); + continue; + } + // Check the peer ip validation. if (!is_emulator() - && !request_validity_to_plugin(PLUGIN_SYNC_CMD_VERIFY_PEERIP, inet_ntoa(addr.sin_addr))) { + && !request_validity_to_plugin(PLUGIN_SYNC_CMD_VERIFY_PEERIP, addr_str)) { sdb_close(fd); } else { int ret = -1; -- 2.34.1