From b0d06eed59b302d6a31218edf003a5d9014f78e1 Mon Sep 17 00:00:00 2001 From: Mcat12 Date: Tue, 21 May 2019 17:29:16 -0700 Subject: [PATCH 1/2] Don't hold a reference to shared memory across locks in resolve.c Fixes #567 Signed-off-by: Mcat12 --- resolve.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/resolve.c b/resolve.c index 5cfdab1bd..1f717b704 100644 --- a/resolve.c +++ b/resolve.c @@ -66,10 +66,11 @@ static char *resolveHostname(const char *addr) // Resolve upstream destination host names static size_t resolveAndAddHostname(size_t ippos, size_t oldnamepos) { - // Get IP and host name strings + // Get IP and host name strings. They are cloned in case shared memory is + // resized before the next lock lock_shm(); - const char* ipaddr = getstr(ippos); - const char* oldname = getstr(oldnamepos); + char* ipaddr = strdup(getstr(ippos)); + char* oldname = strdup(getstr(oldnamepos)); unlock_shm(); // Important: Don't hold a lock while resolving as the main thread @@ -86,6 +87,8 @@ static size_t resolveAndAddHostname(size_t ippos, size_t oldnamepos) // newname has already been checked against NULL // so we can safely free it free(newname); + free(ipaddr); + free(oldname); unlock_shm(); return newnamepos; } @@ -95,6 +98,9 @@ static size_t resolveAndAddHostname(size_t ippos, size_t oldnamepos) logg("Not adding \"%s\" to buffer (unchanged)", oldname); } + free(ipaddr); + free(oldname); + // Not changed, return old namepos return oldnamepos; } From 19921e8da96ece1940d66bdc948d33043f9221a8 Mon Sep 17 00:00:00 2001 From: Mcat12 Date: Wed, 22 May 2019 17:50:21 -0700 Subject: [PATCH 2/2] Fix accessing shared memory outside of lock in networktable.c Signed-off-by: Mcat12 --- networktable.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/networktable.c b/networktable.c index 5d47f4f0e..d5817f9ca 100644 --- a/networktable.c +++ b/networktable.c @@ -116,7 +116,6 @@ void parse_arp_cache(void) // unknown (only DNS requesting clients do this) lock_shm(); int clientID = findClientID(ip, false); - unlock_shm(); // This client is known (by its IP address) to pihole-FTL if // findClientID() returned a non-negative index @@ -177,6 +176,8 @@ void parse_arp_cache(void) // else: // Device in database but not known to Pi-hole: No action required + unlock_shm(); + // Count number of processed ARP cache entries entries++; }