From b2118450f496e12a53694fa3f70f9e123d306ea8 Mon Sep 17 00:00:00 2001
From: Koichiro IWAO
Date: Thu, 27 Oct 2016 17:56:49 +0900
Subject: [PATCH 1/2] common: Fix client IP address logging when IPv6 is
enabled
g_tcp_accept() and g_sck_accept() should use sockadd_in6 when IPv6 is
enabled. The former code logs client IP address always "0.0.0.0" in such
case.
Fixes #412.
---
common/os_calls.c | 77 ++++++++++++++++++++++++++++++++---------------
1 file changed, 52 insertions(+), 25 deletions(-)
diff --git a/common/os_calls.c b/common/os_calls.c
index 0ba4fd98..54359145 100644
--- a/common/os_calls.c
+++ b/common/os_calls.c
@@ -1035,21 +1035,33 @@ g_sck_listen(int sck)
int APP_CC
g_tcp_accept(int sck)
{
- int ret ;
- char ipAddr[256] ;
- struct sockaddr_in s;
- socklen_t i;
+ int ret;
+ char msg[256];
+#if defined(XRDP_ENABLE_IPV6)
+ struct sockaddr_in6 sock;
+#else
+ struct sockaddr_in sock;
+#endif
+ socklen_t sock_len = sizeof(sock);
+ memset(&sock, 0, sock_len);
+
+ ret = accept(sck, (struct sockaddr*) &sock, &sock_len);
- i = sizeof(struct sockaddr_in);
- memset(&s, 0, i);
- ret = accept(sck, (struct sockaddr *)&s, &i);
- if(ret>0)
+ if (ret > 0)
{
- snprintf(ipAddr, 255, "A connection received from: %s port %d",
- inet_ntoa(s.sin_addr), ntohs(s.sin_port));
- log_message(LOG_LEVEL_INFO, "%s", ipAddr);
+#if defined(XRDP_ENABLE_IPV6)
+ char addr[256];
+ inet_ntop(AF_INET6, &sock.sin6_addr, addr, sizeof(addr));
+ snprintf(msg, sizeof(msg), "A connection received from %s port %d",
+ addr, ntohs(sock.sin6_port));
+#else
+ snprintf(msg, sizeof(msg), "A connection received from %s port %d",
+ inet_ntoa(sock.sin_addr), ntohs(sock.sin_port));
+#endif
+ log_message(LOG_LEVEL_INFO, "%s", msg);
}
- return ret ;
+
+ return ret;
}
/*****************************************************************************/
@@ -1057,29 +1069,44 @@ int APP_CC
g_sck_accept(int sck, char *addr, int addr_bytes, char *port, int port_bytes)
{
int ret;
- char ipAddr[256];
- struct sockaddr_in s;
- socklen_t i;
+ char msg[256];
+#if defined(XRDP_ENABLE_IPV6)
+ struct sockaddr_in6 sock;
+#else
+ struct sockaddr_in sock;
+#endif
+ socklen_t sock_len = sizeof(sock);
+ memset(&sock, 0, sock_len);
+
+ ret = accept(sck, (struct sockaddr *)&sock, &sock_len);
- i = sizeof(struct sockaddr_in);
- memset(&s, 0, i);
- ret = accept(sck, (struct sockaddr *)&s, &i);
if (ret > 0)
{
- g_snprintf(ipAddr, 255, "A connection received from: %s port %d",
- inet_ntoa(s.sin_addr), ntohs(s.sin_port));
- log_message(LOG_LEVEL_INFO, "%s", ipAddr);
- if (s.sin_family == AF_INET)
+#if defined(XRDP_ENABLE_IPV6)
+ if (sock.sin6_family == AF_INET6)
{
- g_snprintf(addr, addr_bytes, "%s", inet_ntoa(s.sin_addr));
- g_snprintf(port, port_bytes, "%d", ntohs(s.sin_port));
+ inet_ntop(AF_INET6, &sock.sin6_addr, addr, addr_bytes);
+ g_snprintf(port, port_bytes, "%d", ntohs(sock.sin6_port));
+ }
+ if (sock.sin6_family == AF_UNIX)
+#else
+ if (sock.sin_family == AF_INET)
+ {
+ g_snprintf(addr, addr_bytes, "%s", inet_ntoa(sock.sin_addr));
+ g_snprintf(port, port_bytes, "%d", ntohs(sock.sin_port));
}
- if (s.sin_family == AF_UNIX)
+ if (sock.sin_family == AF_UNIX)
+#endif
{
g_strncpy(addr, "", addr_bytes - 1);
g_strncpy(port, "", port_bytes - 1);
}
+
+ g_snprintf(msg, sizeof(msg), "A connection received from: %s port %s",
+ addr, port);
+ log_message(LOG_LEVEL_INFO, "%s", msg);
}
+
return ret;
}
From dcf36b592bb8a0afe2848f4726729800cfc3d5da Mon Sep 17 00:00:00 2001
From: Koichiro IWAO
Date: Fri, 28 Oct 2016 18:04:37 +0900
Subject: [PATCH 2/2] common: Address family it not always AF_INET6
even if XRDP_ENABLE_IPV6 defined.
---
common/os_calls.c | 120 ++++++++++++++++++++++++++++++++--------------
1 file changed, 84 insertions(+), 36 deletions(-)
diff --git a/common/os_calls.c b/common/os_calls.c
index 54359145..c660d34b 100644
--- a/common/os_calls.c
+++ b/common/os_calls.c
@@ -1037,28 +1037,55 @@ g_tcp_accept(int sck)
{
int ret;
char msg[256];
+ union
+ {
+ struct sockaddr sock_addr;
+ struct sockaddr_in sock_addr_in;
#if defined(XRDP_ENABLE_IPV6)
- struct sockaddr_in6 sock;
-#else
- struct sockaddr_in sock;
+ struct sockaddr_in6 sock_addr_in6;
#endif
- socklen_t sock_len = sizeof(sock);
- memset(&sock, 0, sock_len);
+ } sock_info;
+
+ socklen_t sock_len = sizeof(sock_info);
+ memset(&sock_info, 0, sock_len);
- ret = accept(sck, (struct sockaddr*) &sock, &sock_len);
+ ret = accept(sck, (struct sockaddr *)&sock_info, &sock_len);
if (ret > 0)
{
+ switch(sock_info.sock_addr.sa_family)
+ {
+ case AF_INET:
+ {
+ struct sockaddr_in *sock_addr_in = &sock_info.sock_addr_in;
+
+ snprintf(msg, sizeof(msg), "A connection received from %s port %d",
+ inet_ntoa(sock_addr_in->sin_addr),
+ ntohs(sock_addr_in->sin_port));
+ log_message(LOG_LEVEL_INFO, "%s", msg);
+
+ break;
+ }
+
#if defined(XRDP_ENABLE_IPV6)
- char addr[256];
- inet_ntop(AF_INET6, &sock.sin6_addr, addr, sizeof(addr));
- snprintf(msg, sizeof(msg), "A connection received from %s port %d",
- addr, ntohs(sock.sin6_port));
-#else
- snprintf(msg, sizeof(msg), "A connection received from %s port %d",
- inet_ntoa(sock.sin_addr), ntohs(sock.sin_port));
+
+ case AF_INET6:
+ {
+ struct sockaddr_in6 *sock_addr_in6 = &sock_info.sock_addr_in6;
+ char addr[256];
+
+ inet_ntop(sock_addr_in6->sin6_family,
+ &sock_addr_in6->sin6_addr, addr, sizeof(addr));
+ snprintf(msg, sizeof(msg), "A connection received from %s port %d",
+ addr, ntohs(sock_addr_in6->sin6_port));
+ log_message(LOG_LEVEL_INFO, "%s", msg);
+
+ break;
+
+ }
+
#endif
- log_message(LOG_LEVEL_INFO, "%s", msg);
+ }
}
return ret;
@@ -1070,41 +1097,62 @@ g_sck_accept(int sck, char *addr, int addr_bytes, char *port, int port_bytes)
{
int ret;
char msg[256];
+ union
+ {
+ struct sockaddr sock_addr;
+ struct sockaddr_in sock_addr_in;
#if defined(XRDP_ENABLE_IPV6)
- struct sockaddr_in6 sock;
-#else
- struct sockaddr_in sock;
+ struct sockaddr_in6 sock_addr_in6;
#endif
- socklen_t sock_len = sizeof(sock);
- memset(&sock, 0, sock_len);
+ } sock_info;
+
+ socklen_t sock_len = sizeof(sock_info);
+ memset(&sock_info, 0, sock_len);
- ret = accept(sck, (struct sockaddr *)&sock, &sock_len);
+ ret = accept(sck, (struct sockaddr *)&sock_info, &sock_len);
if (ret > 0)
{
-#if defined(XRDP_ENABLE_IPV6)
- if (sock.sin6_family == AF_INET6)
- {
- inet_ntop(AF_INET6, &sock.sin6_addr, addr, addr_bytes);
- g_snprintf(port, port_bytes, "%d", ntohs(sock.sin6_port));
- }
- if (sock.sin6_family == AF_UNIX)
-#else
- if (sock.sin_family == AF_INET)
+ switch(sock_info.sock_addr.sa_family)
{
- g_snprintf(addr, addr_bytes, "%s", inet_ntoa(sock.sin_addr));
- g_snprintf(port, port_bytes, "%d", ntohs(sock.sin_port));
- }
- if (sock.sin_family == AF_UNIX)
+ case AF_INET:
+ {
+ struct sockaddr_in *sock_addr_in = &sock_info.sock_addr_in;
+
+ g_snprintf(addr, addr_bytes, "%s", inet_ntoa(sock_addr_in->sin_addr));
+ g_snprintf(port, port_bytes, "%d", ntohs(sock_addr_in->sin_port));
+
+ break;
+ }
+
+#if defined(XRDP_ENABLE_IPV6)
+
+ case AF_INET6:
+ {
+ struct sockaddr_in6 *sock_addr_in6 = &sock_info.sock_addr_in6;
+
+ inet_ntop(sock_addr_in6->sin6_family,
+ &sock_addr_in6->sin6_addr, addr, addr_bytes);
+ g_snprintf(port, port_bytes, "%d", ntohs(sock_addr_in6->sin6_port));
+ break;
+ }
+
#endif
- {
- g_strncpy(addr, "", addr_bytes - 1);
- g_strncpy(port, "", port_bytes - 1);
+
+ case AF_UNIX:
+ default:
+ {
+ g_strncpy(addr, "", addr_bytes - 1);
+ g_strncpy(port, "", port_bytes - 1);
+ break;
+ }
}
+
g_snprintf(msg, sizeof(msg), "A connection received from: %s port %s",
addr, port);
log_message(LOG_LEVEL_INFO, "%s", msg);
+
}
return ret;