59 lines
1.4 KiB
Diff
59 lines
1.4 KiB
Diff
From 49c5ff9ad0316960f11b180715b3a6906d42be83 Mon Sep 17 00:00:00 2001
|
|
From: Michael Scherer <misc@zarb.org>
|
|
Date: Sun, 21 Jul 2013 21:59:28 +0100
|
|
Subject: [PATCH] 'struct sockaddr' is not large enough to store a general
|
|
sockaddr.
|
|
|
|
In particular, if IPv6 is used, then sizeof sockaddr_in6 > sizeof sockaddr,
|
|
resulting in a segfault:
|
|
|
|
https://bugzilla.redhat.com/show_bug.cgi?id=986601
|
|
|
|
RWMJ:
|
|
- Minor formatting
|
|
- Free tls->addr on normal exit path
|
|
---
|
|
src/tls.c | 12 +++++++++---
|
|
1 file changed, 9 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/src/tls.c b/src/tls.c
|
|
index 08e8638..390b03e 100644
|
|
--- a/src/tls.c
|
|
+++ b/src/tls.c
|
|
@@ -54,7 +54,7 @@
|
|
struct tls {
|
|
const char *name; /* Can be NULL. */
|
|
size_t instance_num; /* Can be 0. */
|
|
- struct sockaddr addr;
|
|
+ struct sockaddr *addr;
|
|
socklen_t addrlen;
|
|
};
|
|
|
|
@@ -65,6 +65,7 @@ free_tls (void *tlsv)
|
|
{
|
|
struct tls *tls = tlsv;
|
|
|
|
+ free (tls->addr);
|
|
free (tls);
|
|
}
|
|
|
|
@@ -118,8 +119,13 @@ tls_set_sockaddr (struct sockaddr *addr, socklen_t addrlen)
|
|
struct tls *tls = pthread_getspecific (tls_key);
|
|
|
|
if (tls) {
|
|
- tls->addrlen = addrlen;
|
|
- memcpy (&tls->addr, addr, addrlen);
|
|
+ free(tls->addr);
|
|
+ tls->addr = calloc (1, addrlen);
|
|
+ if (tls->addr == NULL) {
|
|
+ perror ("calloc");
|
|
+ exit (EXIT_FAILURE);
|
|
+ }
|
|
+ memcpy(tls->addr, addr, addrlen);
|
|
}
|
|
}
|
|
|
|
--
|
|
1.8.3.1
|
|
|