|
Zbigniew Jędrzejewski-Szmek |
03e93e |
From 93836ed31bf91d10667b67f445af374c2e513bae Mon Sep 17 00:00:00 2001
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
From: Lennart Poettering <lennart@poettering.net>
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
Date: Thu, 29 Dec 2016 11:21:37 +0100
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
Subject: [PATCH] core: fix sockaddr length calculation for sockaddr_pretty()
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
(#4966)
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
Let's simply store the socket address length in the SocketPeer object so
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
that we can use it when invoking sockaddr_pretty():
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
This fixes the issue described in #4943, but avoids calling
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
getpeername() twice.
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
(cherry picked from commit 41733ae1e0035c538505bc5be1ca5d67a80b4a82)
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
---
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
src/core/socket.c | 8 ++++++--
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
1 file changed, 6 insertions(+), 2 deletions(-)
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
diff --git a/src/core/socket.c b/src/core/socket.c
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
index 0b1c4acfec..fe2020008f 100644
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
--- a/src/core/socket.c
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
+++ b/src/core/socket.c
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
@@ -64,6 +64,7 @@ struct SocketPeer {
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
Socket *socket;
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
union sockaddr_union peer;
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
+ socklen_t peer_salen;
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
};
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
static const UnitActiveState state_translation_table[_SOCKET_STATE_MAX] = {
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
@@ -490,8 +491,10 @@ static void peer_address_hash_func(const void *p, struct siphash *state) {
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
if (s->peer.sa.sa_family == AF_INET)
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
siphash24_compress(&s->peer.in.sin_addr, sizeof(s->peer.in.sin_addr), state);
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
- else
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
+ else if (s->peer.sa.sa_family == AF_INET6)
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
siphash24_compress(&s->peer.in6.sin6_addr, sizeof(s->peer.in6.sin6_addr), state);
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
+ else
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
+ assert_not_reached("Unknown address family.");
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
}
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
static int peer_address_compare_func(const void *a, const void *b) {
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
@@ -609,6 +612,7 @@ int socket_acquire_peer(Socket *s, int fd, SocketPeer **p) {
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
return log_oom();
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
remote->peer = sa.peer;
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
+ remote->peer_salen = salen;
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
r = set_put(s->peers_by_address, remote);
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
if (r < 0)
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
@@ -2196,7 +2200,7 @@ static void socket_enter_running(Socket *s, int cfd) {
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
} else if (r > 0 && p->n_ref > s->max_connections_per_source) {
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
_cleanup_free_ char *t = NULL;
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
- sockaddr_pretty(&p->peer.sa, FAMILY_ADDRESS_SIZE(p->peer.sa.sa_family), true, false, &t);
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
+ (void) sockaddr_pretty(&p->peer.sa, p->peer_salen, true, false, &t);
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
log_unit_warning(UNIT(s),
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
"Too many incoming connections (%u) from source %s, dropping connection.",
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
--
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
2.9.3
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
|