Handle IPv4-mapped adresses 86/178586/1 accepted/tizen/unified/20180511.073957 submit/tizen/20180510.142044
authorPaweł Szewczyk <p.szewczyk@samsung.com>
Thu, 10 May 2018 12:08:50 +0000 (14:08 +0200)
committerPaweł Szewczyk <p.szewczyk@samsung.com>
Thu, 10 May 2018 14:03:36 +0000 (16:03 +0200)
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 <p.szewczyk@samsung.com>
src/transport_local.c

index ab307d5..294a365 100644 (file)
@@ -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;