conserver: free correct addrinfo to prevent crash.

When looping through addrinfo lists in AddrsMatch, keep a copy of the
original addrinfo pointers to free instead of ending up at the terminating
NULLs and trying to free those.

OpenWRT uses musl in which freeaddrinfo(NULL) is not safe (which is
fine, it's not required by the spec) so this fixes a segfault.

Signed-off-by: Darren Tucker <dtucker@dtucker.net>
This commit is contained in:
Darren Tucker 2024-02-15 19:33:05 +11:00 committed by Rosen Penev
parent 9e7739057f
commit 69b24ecf6f
2 changed files with 37 additions and 1 deletions

View File

@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=conserver
PKG_VERSION:=8.2.6
PKG_RELEASE:=2
PKG_RELEASE:=3
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/conserver/conserver/tar.gz/v$(PKG_VERSION)?

View File

@ -0,0 +1,36 @@
--- a/conserver/consent.c
+++ b/conserver/consent.c
@@ -1269,7 +1269,7 @@ AddrsMatch(char *addr1, char *addr2)
{
#if USE_IPV6
int error, ret = 0;
- struct addrinfo *ai1, *ai2, hints;
+ struct addrinfo *ai1, *ai2, *rp1, *rp2, hints;
#else
/* so, since we might use inet_addr, we're going to use
* (in_addr_t)(-1) as a sign of an invalid ip address.
@@ -1307,17 +1307,19 @@ AddrsMatch(char *addr1, char *addr2)
goto done;
}
- for (; ai1 != NULL; ai1 = ai1->ai_next) {
- for (; ai2 != NULL; ai2 = ai2->ai_next) {
- if (ai1->ai_addr->sa_family != ai2->ai_addr->sa_family)
+ rp1 = ai1;
+ rp2 = ai2;
+ for (; rp1 != NULL; rp1 = rp1->ai_next) {
+ for (; rp2 != NULL; rp2 = rp2->ai_next) {
+ if (rp1->ai_addr->sa_family != rp2->ai_addr->sa_family)
continue;
if (
# if HAVE_MEMCMP
- memcmp(&ai1->ai_addr, &ai2->ai_addr,
+ memcmp(&rp1->ai_addr, &rp2->ai_addr,
sizeof(struct sockaddr_storage))
# else
- bcmp(&ai1->ai_addr, &ai2->ai_addr,
+ bcmp(&rp1->ai_addr, &rp2->ai_addr,
sizeof(struct sockaddr_storage))
# endif
== 0) {