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