From 69b24ecf6f92feed56ae91cfcf5b56240d90104c Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Thu, 15 Feb 2024 19:33:05 +1100 Subject: [PATCH] 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 --- net/conserver/Makefile | 2 +- .../patches/002-addrsmatch-freeaddrinfo.patch | 36 +++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 net/conserver/patches/002-addrsmatch-freeaddrinfo.patch diff --git a/net/conserver/Makefile b/net/conserver/Makefile index ab3f39aacf..da61bb3495 100644 --- a/net/conserver/Makefile +++ b/net/conserver/Makefile @@ -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)? diff --git a/net/conserver/patches/002-addrsmatch-freeaddrinfo.patch b/net/conserver/patches/002-addrsmatch-freeaddrinfo.patch new file mode 100644 index 0000000000..1d48c684fe --- /dev/null +++ b/net/conserver/patches/002-addrsmatch-freeaddrinfo.patch @@ -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) {