From 87e5ea0bdf650320199ba07cbd7019d81540490c Mon Sep 17 00:00:00 2001
From: mio <miyopan@e.email>
Date: Sat, 28 Sep 2024 20:34:57 +0000
Subject: [PATCH] testing/3proxy: fix build with gcc 14

---
 testing/3proxy/APKBUILD    |    6 +-
 testing/3proxy/gcc14.patch | 1009 ++++++++++++++++++++++++++++++++++++
 2 files changed, 1013 insertions(+), 2 deletions(-)
 create mode 100644 testing/3proxy/gcc14.patch

diff --git a/testing/3proxy/APKBUILD b/testing/3proxy/APKBUILD
index 1e6ff8810223..ec0df4f7f3c5 100644
--- a/testing/3proxy/APKBUILD
+++ b/testing/3proxy/APKBUILD
@@ -2,7 +2,7 @@
 # Maintainer:
 pkgname=3proxy
 pkgver=0.9.4
-pkgrel=0
+pkgrel=1
 pkgdesc="Really tiny cross-platform proxy servers set"
 url="https://3proxy.ru"
 arch="all"
@@ -14,6 +14,7 @@ makedepends="linux-headers"
 install="3proxy.pre-install"
 subpackages="$pkgname-doc $pkgname-openrc"
 source="$pkgname-$pkgver.tar.gz::https://github.com/3proxy/3proxy/archive/$pkgver.tar.gz
+	gcc14.patch
 	$pkgname.initd
 	"
 
@@ -25,7 +26,7 @@ package() {
 	make -f Makefile.Linux DESTDIR="$pkgdir" prefix="/usr" install
 	install -Dm755 "$srcdir"/3proxy.initd "$pkgdir"/etc/init.d/3proxy
 	mv "$pkgdir"/usr/local/3proxy/libexec/*.so "$pkgdir"/usr/lib/
-	rm -rf "$pkgdir"/usr/local
+	rm -rf "${pkgdir:?}"/usr/local
 	chown -R 3proxy:3proxy "$pkgdir"/etc/3proxy
 	install -Dm644 copying "$pkgdir"/usr/share/licenses/$pkgname/COPYING
 
@@ -33,5 +34,6 @@ package() {
 
 sha512sums="
 d3316f6ee1217e580ce593a7bfd9d76672487a89862f247373b0acf3ea207887c758168e33b25db9fc974063deab0826c20d455cab2536d03eee49d8bddda6b5  3proxy-0.9.4.tar.gz
+5ad637d140ce27a5334df39ae8c849ef054a24fd8165174104efa964786f985606cd0e0ce60b4daaf9dcc4fb34e192645ff7540eaa43ce890fcdbe81c8063e1d  gcc14.patch
 043fa5784623e29961ae92f5370598d420e55da6d04f6421b585ac050694982765d6b57ee0276a10738bc8ad0e49ddc4edf6ef288bb9c68e7da11b572066688e  3proxy.initd
 "
diff --git a/testing/3proxy/gcc14.patch b/testing/3proxy/gcc14.patch
new file mode 100644
index 000000000000..ef01b6c9477b
--- /dev/null
+++ b/testing/3proxy/gcc14.patch
@@ -0,0 +1,1009 @@
+Source: https://github.com/3proxy/3proxy/pull/862.patch
+
+The patchset, "Fixed several memory leaks and compiler warnings", includes
+fixes for various warnings that have become errors with gcc 14. This patch
+backports it for version 0.9.4 with a few adjustments (skip src/auto.c hunk on
+non-existent file, modify 2 hunks and skip 1 hunk for src/proxymain.c).
+--
+From e3cbdc94a8d997a160f41f27b1cacac2d9873ec8 Mon Sep 17 00:00:00 2001
+From: Daniel Winzen <daniel@danwin1210.de>
+Date: Mon, 5 Dec 2022 21:38:30 +0100
+Subject: [PATCH 1/4] fix Wformat compiler warnings
+
+---
+ Makefile.msvc                             |  2 +-
+ Makefile.msvc64                           |  2 +-
+ Makefile.msvcARM64                        |  2 +-
+ Makefile.msvcCE                           |  4 ++--
+ Makefile.watcom                           |  2 +-
+ src/3proxy.c                              |  2 +-
+ src/datatypes.c                           |  2 +-
+ src/log.c                                 |  6 +++---
+ src/plugins/LdapPlugin/ldapauth.c         |  4 ++--
+ src/plugins/TrafficPlugin/TrafficPlugin.c |  2 +-
+ src/proxy.c                               | 12 ++++++------
+ src/structures.h                          |  5 +++--
+ src/webadmin.c                            |  4 ++--
+ 13 files changed, 25 insertions(+), 24 deletions(-)
+
+diff --git a/Makefile.msvc b/Makefile.msvc
+index 7fedec32..41e771c7 100644
+--- a/Makefile.msvc
++++ b/Makefile.msvc
+@@ -8,7 +8,7 @@
+ 
+ BUILDDIR = ../bin/
+ CC = cl
+-CFLAGS = /nologo /MT /W3 /Ox /GS /EHs- /GA /GF /D "MSVC" /D "WITH_STD_MALLOC" /D "WITH_WSAPOLL" /D "NDEBUG" /D "WIN32" /D "WITH_SSL" /D "_CONSOLE" /D "_MBCS" /D "_WIN32" /D "PRINTF_INT64_MODIFIER=\"I64\"" /Fp"proxy.pch" /FD /c $(VERSION) $(BUILDDATE)
++CFLAGS = /nologo /MT /W3 /Ox /GS /EHs- /GA /GF /D "MSVC" /D "WITH_STD_MALLOC" /D "WITH_WSAPOLL" /D "NDEBUG" /D "WIN32" /D "WITH_SSL" /D "_CONSOLE" /D "_MBCS" /D "_WIN32" /D "PRIu64=\"I64\"" /Fp"proxy.pch" /FD /c $(VERSION) $(BUILDDATE)
+ COUT = /Fo
+ LN = link
+ LDFLAGS =  /nologo /subsystem:console /incremental:no /machine:I386
+diff --git a/Makefile.msvc64 b/Makefile.msvc64
+index 1d0ed0e6..d67443c4 100644
+--- a/Makefile.msvc64
++++ b/Makefile.msvc64
+@@ -8,7 +8,7 @@
+ 
+ BUILDDIR = ../bin64/
+ CC = cl
+-CFLAGS = /nologo /MT /W3 /Ox /EHs- /GS /GA /GF /D "MSVC" /D "WITH_STD_MALLOC" /D "WITH_SSL" /D "WITH_WSAPOLL" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "_WIN32" /D "PRINTF_INT64_MODIFIER=\"I64\"" /Fp"proxy.pch" /FD /c $(VERSION) $(BUILDDATE)
++CFLAGS = /nologo /MT /W3 /Ox /EHs- /GS /GA /GF /D "MSVC" /D "WITH_STD_MALLOC" /D "WITH_SSL" /D "WITH_WSAPOLL" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "_WIN32" /D "PRIu64=\"I64\"" /Fp"proxy.pch" /FD /c $(VERSION) $(BUILDDATE)
+ COUT = /Fo
+ LN = link
+ LDFLAGS = /nologo /subsystem:console /incremental:no /machine:x64
+diff --git a/Makefile.msvcARM64 b/Makefile.msvcARM64
+index 43c559f9..2b51c6a2 100644
+--- a/Makefile.msvcARM64
++++ b/Makefile.msvcARM64
+@@ -8,7 +8,7 @@
+ 
+ BUILDDIR = ../bin64/
+ CC = cl
+-CFLAGS = /nologo /MT /W3 /Ox /EHs- /GS /GA /GF /D "MSVC" /D "WITH_STD_MALLOC" /D "WITH_WSAPOLL" /D "WITH_SSL" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "_WIN32" /D "PRINTF_INT64_MODIFIER=\"I64\"" /Fp"proxy.pch" /FD /c $(VERSION) $(BUILDDATE)
++CFLAGS = /nologo /MT /W3 /Ox /EHs- /GS /GA /GF /D "MSVC" /D "WITH_STD_MALLOC" /D "WITH_WSAPOLL" /D "WITH_SSL" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "_WIN32" /D "PRIu64=\"I64\"" /Fp"proxy.pch" /FD /c $(VERSION) $(BUILDDATE)
+ COUT = /Fo
+ LN = link
+ LDFLAGS = /nologo /subsystem:console /incremental:no /machine:arm64
+diff --git a/Makefile.msvcCE b/Makefile.msvcCE
+index bbff3fae..339e5e9a 100644
+--- a/Makefile.msvcCE
++++ b/Makefile.msvcCE
+@@ -8,7 +8,7 @@
+ 
+ BUILDDIR = ../bin/
+ CC = cl
+-CFLAGS = /DARM /D "NOODBC" /nologo /MT /W3 /Wp64 /Ox /GS /EHs- /GA /GF /D "MSVC" /D "_WINCE" /D "WITH_STD_MALLOC" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "_WIN32" /D "PRINTF_INT64_MODIFIER=\"I64\"" /Fp"proxy.pch" /FD /c
++CFLAGS = /DARM /D "NOODBC" /nologo /MT /W3 /Wp64 /Ox /GS /EHs- /GA /GF /D "MSVC" /D "_WINCE" /D "WITH_STD_MALLOC" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "_WIN32" /D "PRIu64=\"I64\"" /Fp"proxy.pch" /FD /c
+ COUT = /Fo
+ LN = link
+ LDFLAGS = /nologo /subsystem:console /incremental:no
+@@ -32,4 +32,4 @@ include Makefile.inc
+ 
+ allplugins:
+ 	for /D %%i in ($(PLUGINS)) do (copy Makefile plugins\%%i && copy Makefile.var plugins\%%i && cd plugins\%%i && nmake && del *.obj *.idb &&cd ..\..)
+-	
+\ No newline at end of file
++	
+diff --git a/Makefile.watcom b/Makefile.watcom
+index 4eab7355..df909a9d 100644
+--- a/Makefile.watcom
++++ b/Makefile.watcom
+@@ -8,7 +8,7 @@
+ 
+ BUILDDIR = ../bin/
+ CC = cl
+-CFLAGS = /nologo /Ox /MT /D "NOIPV6" /D "NODEBUG" /D "NOODBC" /D "NORADIUS" /D"WATCOM" /D "MSVC" /D "WITH_STD_MALLOC" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "_WIN32" /D "PRINTF_INT64_MODIFIER=\"I64\"" /c $(VERSION) $(BUILDDATE)
++CFLAGS = /nologo /Ox /MT /D "NOIPV6" /D "NODEBUG" /D "NOODBC" /D "NORADIUS" /D"WATCOM" /D "MSVC" /D "WITH_STD_MALLOC" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "_WIN32" /D "PRIu64=\"I64\"" /c $(VERSION) $(BUILDDATE)
+ COUT = /Fo
+ LN = link
+ LDFLAGS = /nologo /subsystem:console /incremental:no 
+diff --git a/src/3proxy.c b/src/3proxy.c
+index 9082f502..c83b3727 100644
+--- a/src/3proxy.c
++++ b/src/3proxy.c
+@@ -209,7 +209,7 @@ void dumpcounters(struct trafcount *tlin, int counterd){
+ 		if(cfp){
+ 			for(tl = tlin; cfp && tl; tl = tl->next){
+ 				if(tl->type >= conf.countertype)
+-					fprintf(cfp, "%05d %020"PRINTF_INT64_MODIFIER"u%s%s\n", tl->number, tl->traf64, tl->comment?" #" : "", tl->comment? tl->comment : "");
++                    fprintf(cfp, "%05d %020"PRIu64"u%s%s\n", tl->number, tl->traf64, tl->comment?" #" : "", tl->comment? tl->comment : "");
+ 			}
+ 			fclose(cfp);
+ 		}
+diff --git a/src/datatypes.c b/src/datatypes.c
+index 0d991c67..2fb167db 100644
+--- a/src/datatypes.c
++++ b/src/datatypes.c
+@@ -9,7 +9,7 @@
+ 
+ static void pr_unsigned64(struct node *node, CBFUNC cbf, void*cb){
+ 	char buf[32];
+-	if(node->value)(*cbf)(cb, buf, sprintf(buf, "%"PRINTF_INT64_MODIFIER"u", *(uint64_t *)node->value));
++	if(node->value)(*cbf)(cb, buf, sprintf(buf, "%"PRIu64"u", *(uint64_t *)node->value));
+ }
+ 
+ static void pr_integer(struct node *node, CBFUNC cbf, void*cb){
+diff --git a/src/log.c b/src/log.c
+index abeea86b..02e66b1c 100644
+--- a/src/log.c
++++ b/src/log.c
+@@ -246,15 +246,15 @@ int dobuf2(struct clientparam * param, unsigned char * buf, const unsigned char
+ 				 i += (int)strlen((char *)buf+i);
+ 				 break;
+ 				case 'L':
+-				 sprintf((char *)buf+i, "%"PRINTF_INT64_MODIFIER"u", param->cycles);
++				 sprintf((char *)buf+i, "%"PRIu64"u", param->cycles);
+ 				 i += (int)strlen((char *)buf+i);
+ 				 break;
+ 				case 'I':
+-				 sprintf((char *)buf+i, "%"PRINTF_INT64_MODIFIER"u", param->statssrv64);
++				 sprintf((char *)buf+i, "%"PRIu64"u", param->statssrv64);
+ 				 i += (int)strlen((char *)buf+i);
+ 				 break;
+ 				case 'O':
+-				 sprintf((char *)buf+i, "%"PRINTF_INT64_MODIFIER"u", param->statscli64);
++				 sprintf((char *)buf+i, "%"PRIu64"u", param->statscli64);
+ 				 i += (int)strlen((char *)buf+i);
+ 				 break;
+ 				case 'h':
+diff --git a/src/plugins/LdapPlugin/ldapauth.c b/src/plugins/LdapPlugin/ldapauth.c
+index 1572b4d8..dbff3ade 100644
+--- a/src/plugins/LdapPlugin/ldapauth.c
++++ b/src/plugins/LdapPlugin/ldapauth.c
+@@ -72,7 +72,7 @@ int savecounters(void)
+       sprintf(tmpbuf,pat_file,ldap_dircount,tcd->ace->users->user);
+       f=fopen(tmpbuf,"w+b");
+       fseek(f,0,SEEK_SET);
+-      fprintf(f,"%"PRINTF_INT64_MODIFIER"u %lu %lu\n",tcd->traf64,
++      fprintf(f,"%"PRIu64"u %lu %lu\n",tcd->traf64,
+ 					(unsigned long)tcd->cleared,(unsigned long)tcd->updated);
+ 
+       fclose(f);
+@@ -387,7 +387,7 @@ int h_trafgroup(int argc, unsigned char ** argv)
+ 		
+                fseek(f,0,SEEK_SET);
+                fgets(buf, 256, f); 
+-  	       sscanf(buf,"%"PRINTF_INT64_MODIFIER"u %lu %lu\n",&rcounter.traf64, 
++  	       sscanf(buf,"%"PRIu64"u %lu %lu\n",&rcounter.traf64, 
+ 				&rcounter.cleared, &rcounter.updated);
+ 
+ 
+diff --git a/src/plugins/TrafficPlugin/TrafficPlugin.c b/src/plugins/TrafficPlugin/TrafficPlugin.c
+index 5cf23aa0..16cfbcb0 100644
+--- a/src/plugins/TrafficPlugin/TrafficPlugin.c
++++ b/src/plugins/TrafficPlugin/TrafficPlugin.c
+@@ -240,7 +240,7 @@ void mylogfunc(struct clientparam * param, const unsigned char * pz) {
+ 				}
+ 				if (DBGLEVEL == 1) {
+ #ifndef NOPSTDINT
+-					fprintf(stdout, "Port=%hd; Before: srv=%"PRINTF_INT64_MODIFIER"d, cli=%"PRINTF_INT64_MODIFIER"d; After:  srv=%"PRINTF_INT64_MODIFIER"d, cli=%"PRINTF_INT64_MODIFIER"d; nreads=%ld; nwrites=%ld; Rule=%d\n",myhtons(*SAPORT(&param->sinsr)), statssrv_before, statscli_before, param->statssrv64, param->statscli64,param->nreads,param->nwrites,rule);
++					fprintf(stdout, "Port=%hd; Before: srv=%"PRIu64"d, cli=%"PRIu64"d; After:  srv=%"PRIu64"d, cli=%"PRIu64"d; nreads=%ld; nwrites=%ld; Rule=%d\n",myhtons(*SAPORT(&param->sinsr)), statssrv_before, statscli_before, param->statssrv64, param->statscli64,param->nreads,param->nwrites,rule);
+ #else
+ 					fprintf(stdout, "Port=%hd; Before: srv=%lu, cli=%lu; After:  srv=%lu, cli=%lu; nreads=%ld; nwrites=%ld; Rule=%d\n",myhtons(param->sins.sin_port), statssrv_before, statscli_before, param->statssrv, param->statscli,param->nreads,param->nwrites,rule);
+ #endif
+diff --git a/src/proxy.c b/src/proxy.c
+index 881ef1e2..f7bb56cf 100644
+--- a/src/proxy.c
++++ b/src/proxy.c
+@@ -393,7 +393,7 @@ for(;;){
+ 				while( (i = sockgetlinebuf(param, CLIENT, buf, BUFSIZE - 1, '\n', conf.timeouts[STRING_S])) > 2){
+ 					if(i> 15 && (!strncasecmp((char *)(buf), "content-length", 14))){
+ 						buf[i]=0;
+-						sscanf((char *)buf + 15, "%"PRINTF_INT64_MODIFIER"u", &contentlength64);
++						sscanf((char *)buf + 15, "%"PRIu64"u", &contentlength64);
+ 					}
+ 				}
+ 				while( contentlength64 > 0 && (i = sockgetlinebuf(param, CLIENT, buf, (BUFSIZE < contentlength64)? BUFSIZE - 1:(int)contentlength64, '\n', conf.timeouts[STRING_S])) > 0){
+@@ -503,7 +503,7 @@ for(;;){
+ 		if(!sb)continue;
+ 		++sb;
+ 		while(isspace(*sb))sb++;
+-		sscanf((char *)sb, "%"PRINTF_INT64_MODIFIER"u",&contentlength64);
++		sscanf((char *)sb, "%"PRIu64"u",&contentlength64);
+ 		if(param->maxtrafout64 && (param->maxtrafout64 < param->statscli64 || contentlength64 > param->maxtrafout64 - param->statscli64)){
+ 			RETURN(10);
+ 		}
+@@ -581,7 +581,7 @@ for(;;){
+ 	contentlength64 = param->cliinbuf;
+ 	param->nolongdatfilter = 1;
+   }
+-  sprintf((char*)buf+strlen((char *)buf), "Content-Length: %"PRINTF_INT64_MODIFIER"u\r\n", contentlength64);
++  sprintf((char*)buf+strlen((char *)buf), "Content-Length: %"PRIu64"u\r\n", contentlength64);
+  }
+ 
+ #endif
+@@ -955,7 +955,7 @@ for(;;){
+ 		if(!sb)continue;
+ 		++sb;
+ 		while(isspace(*sb))sb++;
+-		sscanf((char *)sb, "%"PRINTF_INT64_MODIFIER"u", &contentlength64);
++		sscanf((char *)sb, "%"PRIu64"u", &contentlength64);
+ 		hascontent = 1;
+ 		if(param->unsafefilter && param->ndatfilterssrv > 0) {
+ 			hascontent = 2;
+@@ -1033,7 +1033,7 @@ for(;;){
+ 	}
+ 	if(action != PASS) RETURN(517);
+ 	contentlength64 = param->srvinbuf;
+-	sprintf((char*)buf+strlen((char *)buf), "Content-Length: %"PRINTF_INT64_MODIFIER"u\r\n", contentlength64);
++	sprintf((char*)buf+strlen((char *)buf), "Content-Length: %"PRIu64"u\r\n", contentlength64);
+ 	hascontent = 1;
+   }
+  }
+@@ -1080,7 +1080,7 @@ for(;;){
+ 			}
+ 			smallbuf[i] = 0;
+ 			contentlength64 = 0;
+-			sscanf((char *)smallbuf, "%"PRINTF_INT64_MODIFIER"x", &contentlength64);
++			sscanf((char *)smallbuf, "%"PRIu64"x", &contentlength64);
+ 			if(contentlength64 == 0) {
+ 				param->chunked = 2;
+ 			}
+diff --git a/src/structures.h b/src/structures.h
+index 8d41374a..d41e8a84 100644
+--- a/src/structures.h
++++ b/src/structures.h
+@@ -15,8 +15,9 @@
+ #include <sys/types.h>
+ #include <sys/stat.h>
+ #include <stdint.h>
+-#ifndef PRINTF_INT64_MODIFIER
+-#define PRINTF_INT64_MODIFIER "ll"
++#include <inttypes.h>
++#ifndef PRIu64
++#define PRIu64 "ll"
+ #endif
+ #ifdef  __cplusplus
+ extern "C" {
+diff --git a/src/webadmin.c b/src/webadmin.c
+index 0aefc38e..4f5a5675 100644
+--- a/src/webadmin.c
++++ b/src/webadmin.c
+@@ -510,9 +510,9 @@ void * adminchild(struct clientparam* param) {
+ 			 }
+ 			 else {
+ 			  inbuf += sprintf(buf+inbuf,	
+-					"</td><td>%"PRINTF_INT64_MODIFIER"u</td>"
++					"</td><td>%"PRIu64"u</td>"
+ 					"<td>MB%s</td>"
+-					"<td>%"PRINTF_INT64_MODIFIER"u.%"PRINTF_INT64_MODIFIER"u</td>"
++					"<td>%"PRIu64"u.%"PRIu64"u</td>"
+ 					"<td>%s</td>",
+ 				 cp->traflim64 / (1024 * 1024),
+ 				 rotations[cp->type],
+
+From a65286eb9d47b16700edf24c80067606b4a66aa5 Mon Sep 17 00:00:00 2001
+From: Daniel Winzen <daniel@danwin1210.de>
+Date: Wed, 7 Dec 2022 00:01:52 +0100
+Subject: [PATCH 2/4] Fix memory leaks related to configuration
+
+---
+ src/3proxy.c     | 46 ++++++++++++++++-------------
+ src/common.c     |  1 -
+ src/conf.c       | 77 +++++++++++++++++++++++++++++++++++++++++-------
+ src/proxy.h      |  1 +
+ src/structures.h |  1 -
+ 5 files changed, 94 insertions(+), 32 deletions(-)
+
+diff --git a/src/3proxy.c b/src/3proxy.c
+index c83b3727..da705ee1 100644
+--- a/src/3proxy.c
++++ b/src/3proxy.c
+@@ -169,7 +169,7 @@ int timechanged (time_t oldtime, time_t newtime, ROTATION lt){
+ 				)return 1;
+ 			break;
+ 		default:
+-			break;	
++			break;
+ 	}
+ 	return 0;
+ }
+@@ -204,12 +204,12 @@ void dumpcounters(struct trafcount *tlin, int counterd){
+ 	conf.time = time(0);
+ 	if(cheader.updated && conf.countertype && timechanged(cheader.updated, conf.time, conf.countertype)){
+ 		FILE * cfp;
+-				
++
+ 		cfp = fopen((char *)dologname(tmpbuf, (unsigned char *)conf.counterfile, NULL, conf.countertype, cheader.updated), "w");
+ 		if(cfp){
+ 			for(tl = tlin; cfp && tl; tl = tl->next){
+ 				if(tl->type >= conf.countertype)
+-                    fprintf(cfp, "%05d %020"PRIu64"u%s%s\n", tl->number, tl->traf64, tl->comment?" #" : "", tl->comment? tl->comment : "");
++					fprintf(cfp, "%05d %020"PRIu64"u%s%s\n", tl->number, tl->traf64, tl->comment?" #" : "", tl->comment? tl->comment : "");
+ 			}
+ 			fclose(cfp);
+ 		}
+@@ -218,10 +218,10 @@ void dumpcounters(struct trafcount *tlin, int counterd){
+ 
+ 	cheader.updated = conf.time;
+ 	lseek(counterd, 0, SEEK_SET);
+-	write(counterd, &cheader, sizeof(struct counter_header));			
++	write(counterd, &cheader, sizeof(struct counter_header));
+ 	for(tl=tlin; tl; tl = tl->next){
+ 		if(tl->number){
+-			lseek(counterd, 
++			lseek(counterd,
+ 				sizeof(struct counter_header) + (tl->number - 1) * sizeof(struct counter_record),
+ 				SEEK_SET);
+ 			crecord.traf64 = tl->traf64;
+@@ -245,7 +245,7 @@ void cyclestep(void){
+  minutecounter = time(0);
+  for(;;){
+ 	usleep(SLEEPTIME*999);
+-	
++
+ 	conf.time = time(0);
+ 	if(conf.needreload) {
+ 		doschedule();
+@@ -266,7 +266,7 @@ void cyclestep(void){
+ 				}
+ 			}
+ 		}
+-		
++
+ 	}
+ 	if(timechanged(basetime, conf.time, DAILY)) {
+ 		tm = localtime(&conf.time);
+@@ -336,7 +336,7 @@ void cyclestep(void){
+ 		usleep(SLEEPTIME*999);
+ 		return;
+ 	}
+-		
++
+  }
+ }
+ 
+@@ -392,11 +392,11 @@ int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int
+ 
+ 	sprintf((char *)tmpbuf, "%s will be installed and started.\n"
+ 			"By clicking Yes you confirm you read and accepted License Agreement.\n"
+-			"You can use Administration/Services to control %s service.", 
++			"You can use Administration/Services to control %s service.",
+ 			conf.stringtable[1], conf.stringtable[2]);
+ 	if(MessageBox(NULL, (LPCSTR)tmpbuf, (LPCSTR)conf.stringtable[2], MB_YESNO|MB_ICONASTERISK) != IDYES) return 1;
+ 
+-	
++
+ 	*tmpbuf = '\"';
+ 	if (!(res = SearchPath(NULL, argv[0], ".exe", 256, (char *)tmpbuf+1, (LPTSTR*)&arg))) {
+ 		perror("Failed to find executable filename");
+@@ -427,7 +427,7 @@ int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int
+ 	else {
+ 		HKEY runsrv;
+ 
+-		if(RegOpenKeyEx( HKEY_LOCAL_MACHINE, 
++		if(RegOpenKeyEx( HKEY_LOCAL_MACHINE,
+ 				"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",
+ 				0,
+ 				KEY_ALL_ACCESS,
+@@ -468,7 +468,7 @@ int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int
+ 	}
+ 	else {
+ 		HKEY runsrv;
+-		if(RegOpenKeyEx( HKEY_LOCAL_MACHINE, 
++		if(RegOpenKeyEx( HKEY_LOCAL_MACHINE,
+ 				"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",
+ 				0,
+ 				KEY_ALL_ACCESS,
+@@ -530,22 +530,22 @@ int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int
+   if(!writable)fclose(fp);
+ 
+ #ifdef _WIN32
+-  
++
+ #ifndef _WINCE
+   if(service){
+-	SERVICE_TABLE_ENTRY ste[] = 
++	SERVICE_TABLE_ENTRY ste[] =
+ 	{
+-        	{ (LPSTR)conf.stringtable[1], (LPSERVICE_MAIN_FUNCTION)ServiceMain},
+-	        { NULL, NULL }
+-	};	
+- 	if(!StartServiceCtrlDispatcher( ste ))cyclestep();
++			{ (LPSTR)conf.stringtable[1], (LPSERVICE_MAIN_FUNCTION)ServiceMain},
++			{ NULL, NULL }
++	};
++	if(!StartServiceCtrlDispatcher( ste ))cyclestep();
+   }
+-  else 
++  else
+ #endif
+   {
+ 	cyclestep();
+   }
+-  
++
+ 
+ #else
+ 	 signal(SIGCONT, mysigpause);
+@@ -558,6 +558,12 @@ int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int
+ 
+ CLEARRETURN:
+ 
++	 freeconf(&conf);
++	 myfree(conf.conffile);
++	 freeauth(conf.authfuncs);
++	 destroyhashtable(&dns_table);
++	 destroyhashtable(&dns6_table);
++	 fprintf(stderr, "hi\n");
+  return 0;
+ 
+ }
+diff --git a/src/common.c b/src/common.c
+index e8106e2c..dd4b7f67 100644
+--- a/src/common.c
++++ b/src/common.c
+@@ -114,7 +114,6 @@ struct extparam conf = {
+ #else
+ 	{AF_INET},{AF_INET}, 
+ #endif
+-	NULL,
+ 	NULL,
+ 	doconnect,
+ 	lognone,
+diff --git a/src/conf.c b/src/conf.c
+index 3d7a5458..11ecbfa1 100644
+--- a/src/conf.c
++++ b/src/conf.c
+@@ -400,7 +400,7 @@ static int h_include(int argc, unsigned char **argv){
+ static int h_archiver(int argc, unsigned char **argv){
+ 	int j;
+ 
+-	conf.archiver = myalloc(argc * sizeof(char *));
++	conf.archiver = myalloc(argc * sizeof(unsigned char *));
+ 	if(conf.archiver) {
+ 		conf.archiverc = argc;
+ 		for(j = 0; j < conf.archiverc; j++) conf.archiver[j] = (unsigned char *)mystrdup((char *)argv[j]);
+@@ -532,9 +532,21 @@ static int h_users(int argc, unsigned char **argv){
+ 				pwl->password = (unsigned char *) mystrdup((char *)arg + 1);
+ 				pwl->pwtype = UN;
+ 			}
+-			if(!pwl->password) return 3;
++			if(!pwl->password){
++				if(pwl->user){
++					myfree(pwl->user);
++				}
++				myfree(pwl);
++				return 3;
++			}
++		}
++		if(!pwl->user){
++			if(pwl->password){
++				myfree(pwl->password);
++			}
++			myfree(pwl);
++			return 21;
+ 		}
+-		if(!pwl->user) return 21;
+ 		pthread_mutex_lock(&pwl_mutex);
+ 		pwl->next = conf.pwl;
+ 		conf.pwl = pwl;
+@@ -715,7 +727,10 @@ static int h_monitor(int argc, unsigned char **argv){
+ 	}
+ 	else {
+ 		fm->path = mystrdup((char *)argv[1]);
+-		if(!fm->path) return 21;
++		if(!fm->path){
++			myfree(fm);
++			return 21;
++		}
+ 		fm->next = conf.fmon;
+ 		conf.fmon = fm;
+ 	}
+@@ -743,6 +758,7 @@ static int h_parent(int argc, unsigned char **argv){
+ 	chains->weight = (unsigned)atoi((char *)argv[1]);
+ 	if(chains->weight == 0 || chains->weight >1000) {
+ 		fprintf(stderr, "Chaining error: bad chain weight %u line %d\n", chains->weight, linenum);
++		myfree(chains);
+ 		return(3);
+ 	}
+ 	if(!strcmp((char *)argv[2], "tcp"))chains->type = R_TCP;
+@@ -762,6 +778,7 @@ static int h_parent(int argc, unsigned char **argv){
+ 	else if(!strcmp((char *)argv[2], "smtp"))chains->type = R_SMTP;
+ 	else {
+ 		fprintf(stderr, "Chaining error: bad chain type (%s)\n", argv[2]);
++		myfree(chains);
+ 		return(4);
+ 	}
+ 	cidr = strchr(argv[3], '/');
+@@ -881,11 +898,15 @@ struct ace * make_ace (int argc, unsigned char ** argv){
+ 				}
+ 				if(!userl) {
+ 					fprintf(stderr, "No memory for ACL entry, line %d\n", linenum);
++					freeacl(acl);
+ 					return(NULL);
+ 				}
+ 				memset(userl, 0, sizeof(struct userlist));
+ 				userl->user=(unsigned char*)mystrdup((char *)arg);
+-				if(!userl->user) return NULL;
++				if(!userl->user){
++					freeacl(acl);
++					return NULL;
++				}
+ 			} while((arg = (unsigned char *)strtok((char *)NULL, ",")));
+ 		}
+ 		if(argc > 1  && strcmp("*", (char *)argv[1])) {
+@@ -900,11 +921,13 @@ struct ace * make_ace (int argc, unsigned char ** argv){
+ 				}
+ 				if(!ipl) {
+ 					fprintf(stderr, "No memory for ACL entry, line %d\n", linenum);
++					freeacl(acl);
+ 					return(NULL);
+ 				}
+ 				memset(ipl, 0, sizeof(struct iplist));
+ 				if (scanipl(arg, ipl)) {
+ 					fprintf(stderr, "Invalid IP, IP range or CIDR, line %d\n", linenum);
++					freeacl(acl);
+ 					return(NULL);
+ 				}
+ 			} while((arg = (unsigned char *)strtok((char *)NULL, ",")));
+@@ -928,6 +951,7 @@ struct ace * make_ace (int argc, unsigned char ** argv){
+ 				}
+ 				if(!hostnamel){
+ 					fprintf(stderr, "No memory for ACL entry, line %d\n", linenum);
++					freeacl(acl);
+ 					return(NULL);
+ 				}
+ 				memset(hostnamel, 0, sizeof(struct hostname));
+@@ -946,6 +970,7 @@ struct ace * make_ace (int argc, unsigned char ** argv){
+ 				hostnamel->name = (unsigned char *) mystrdup( (char *)pattern);
+ 				if(!hostnamel->name) {
+ 					fprintf(stderr, "No memory for ACL entry, line %d\n", linenum);
++					freeacl(acl);
+ 					return(NULL);
+ 				}
+ 			 }
+@@ -960,6 +985,7 @@ struct ace * make_ace (int argc, unsigned char ** argv){
+ 				}
+ 				if(!ipl) {
+ 					fprintf(stderr, "No memory for ACL entry, line %d\n", linenum);
++					freeacl(acl);
+ 					return(NULL);
+ 				}
+ 				*ipl = tmpip;
+@@ -978,12 +1004,14 @@ struct ace * make_ace (int argc, unsigned char ** argv){
+ 				}
+ 				if(!portl) {
+ 					fprintf(stderr, "No memory for ACL entry, line %d\n", linenum);
++					freeacl(acl);
+ 					return(NULL);
+ 				}
+ 				memset(portl, 0, sizeof(struct portlist));
+ 				res = sscanf((char *)arg, "%hu-%hu", &portl->startport, &portl->endport);
+ 				if(res < 1) {
+ 					fprintf(stderr, "Invalid port or port range, line %d\n", linenum);
++					freeacl(acl);
+ 					return(NULL);
+ 				}
+ 				if (res == 1) portl->endport = portl->startport;
+@@ -1051,6 +1079,7 @@ struct ace * make_ace (int argc, unsigned char ** argv){
+ 				}
+ 				else {
+ 					fprintf(stderr, "Unknown operation type: %s line %d\n", arg, linenum);
++					freeacl(acl);
+ 					return(NULL);
+ 				}
+ 			} while((arg = (unsigned char *)strtok((char *)NULL, ",")));
+@@ -1315,6 +1344,8 @@ static int h_ace(int argc, unsigned char **argv){
+ 				tl->cleared = crecord.cleared;
+ 				tl->updated = crecord.updated;
+ 				if(tl->cleared < 0 || tl->cleared >=  MAX_COUNTER_TIME || tl->updated < 0 || tl->updated >=  MAX_COUNTER_TIME){
++					myfree(tl);
++					freeacl(acl);
+ 					fprintf(stderr, "Invalid, incompatible or corrupted counter file.\n");
+ 					return(6);
+ 				}
+@@ -1731,6 +1762,7 @@ int readconfig(FILE * fp){
+   int res = 0;
+ 
+   if( !(buf = myalloc(bufsize)) || ! (argv = myalloc((NPARAMS + 1) * sizeof(unsigned char *))) ) {
++		if(buf) myfree(buf);
+ 		fprintf(stderr, "No memory for configuration");
+ 		return(10);
+   }
+@@ -1740,6 +1772,8 @@ int readconfig(FILE * fp){
+ 	inbuf = (int)(strlen((char *)buf) + 1);
+ 	argc = parsestr (buf, argv, NPARAMS-1, &buf, &inbuf, &bufsize);
+ 	if(argc < 1) {
++		myfree(buf);
++		myfree(argv);
+ 		fprintf(stderr, "Parse error line %d\n", linenum);
+ 		return(11);
+ 	}
+@@ -1751,6 +1785,8 @@ int readconfig(FILE * fp){
+ 		if(!writable){
+ 			writable = freopen(curconf, "r+", fp);
+ 			if(!writable){
++				myfree(buf);
++				myfree(argv);
+ 				fprintf(stderr, "Unable to reopen config for writing: %s\n", curconf);
+ 				return 1;
+ 			}
+@@ -1764,6 +1800,8 @@ int readconfig(FILE * fp){
+ 			res = (*cm->handler)(argc, argv);
+ 			if(res > 0){
+ 				fprintf(stderr, "Command: '%s' failed with code %d, line %d\n", argv[0], res, linenum);
++				myfree(buf);
++				myfree(argv);
+ 				return(linenum);
+ 			}
+ 			if(!res) break;
+@@ -1771,6 +1809,8 @@ int readconfig(FILE * fp){
+ 	}
+ 	if(res != 1)continue;
+ 	fprintf(stderr, "Unknown command: '%s' line %d\n", argv[0], linenum);
++	myfree(buf);
++	myfree(argv);
+ 	return(linenum);
+   }
+   myfree(buf);
+@@ -1795,12 +1835,16 @@ void freeconf(struct extparam *confp){
+  struct connlim * cl;
+  struct trafcount * tc;
+  struct passwords *pw;
++ struct auth *authfuncs;
+  struct ace *acl;
+  struct filemon *fm;
+  int counterd, archiverc;
+  unsigned char *logname, *logtarget;
+  unsigned char **archiver;
+  unsigned char * logformat;
++ char * counterfile;
++ FILE *stdlog;
++ char* demanddialprog;
+ 
+  int i;
+ 
+@@ -1835,12 +1879,10 @@ void freeconf(struct extparam *confp){
+  pthread_mutex_unlock(&pwl_mutex);
+ 
+ 
+-/*
+  logtarget = confp->logtarget;
+  confp->logtarget = NULL;
+  logname = confp->logname;
+  confp->logname = NULL;
+-*/
+  confp->logfunc = lognone;
+  logformat = confp->logformat;
+  confp->logformat = NULL;
+@@ -1869,6 +1911,14 @@ void freeconf(struct extparam *confp){
+  numservers = 0;
+  acl = confp->acl;
+  confp->acl = NULL;
++ authfuncs = confp->authfuncs;
++ confp->authfuncs = NULL;
++ counterfile = confp->counterfile;
++ confp->counterfile = NULL;
++ stdlog = confp->stdlog;
++ confp->stdlog = NULL;
++ demanddialprog = confp->demanddialprog;
++ confp->demanddialprog = NULL;
+ 
+  usleep(SLEEPTIME);
+ 
+@@ -1882,7 +1932,7 @@ void freeconf(struct extparam *confp){
+ 	freeacl(tc->ace);
+  }
+ 
+- 
++ freeauth(authfuncs);
+  freeacl(acl);
+  freepwl(pw);
+  for(; bl; bl = (struct bandlim *) itfree(bl, bl->next)) freeacl(bl->ace);
+@@ -1895,14 +1945,12 @@ void freeconf(struct extparam *confp){
+  for(; fm; fm = (struct filemon *)itfree(fm, fm->next)){
+ 	if(fm->path) myfree(fm->path);
+  }
+-/*
+  if(logtarget) {
+ 	myfree(logtarget);
+  }
+  if(logname) {
+ 	myfree(logname);
+  }
+-*/
+  if(logformat) {
+ 	myfree(logformat);
+  }
+@@ -1911,6 +1959,15 @@ void freeconf(struct extparam *confp){
+ 	myfree(archiver);
+  }
+  havelog = 0;
++ if(counterfile){
++	myfree(counterfile);
++ }
++ if(stdlog){
++	fclose(stdlog);
++ }
++ if(demanddialprog){
++	myfree(demanddialprog);
++ }
+ }
+ 
+ int reload (void){
+diff --git a/src/proxy.h b/src/proxy.h
+index f9be0b47..03a15176 100644
+--- a/src/proxy.h
++++ b/src/proxy.h
+@@ -203,6 +203,7 @@ int afdetect(unsigned char *name);
+ unsigned long myresolver(int, unsigned char *, unsigned char *);
+ unsigned long fakeresolver (int, unsigned char *, unsigned char*);
+ int inithashtable(struct hashtable *hashtable, unsigned nhashsize);
++void destroyhashtable(struct hashtable *ht);
+ void freeparam(struct clientparam * param);
+ void clearstat(struct clientparam * param);
+ void dumpcounters(struct trafcount *tl, int counterd);
+diff --git a/src/structures.h b/src/structures.h
+index d41e8a84..db096758 100644
+--- a/src/structures.h
++++ b/src/structures.h
+@@ -596,7 +596,6 @@ struct extparam {
+ 	struct sockaddr_in extsa;
+ #endif
+ 	struct passwords *pwl;
+-	struct auth * authenticate;
+ 	AUTHFUNC authfunc;
+ 	LOGFUNC logfunc;
+ 	BANDLIMFUNC bandlimfunc;
+
+From c0069df57250f8254c40d3a0b5b07e8db2de7a7d Mon Sep 17 00:00:00 2001
+From: Daniel Winzen <daniel@danwin1210.de>
+Date: Wed, 7 Dec 2022 19:44:14 +0100
+Subject: [PATCH 3/4] Fix pointer-sign and incompatible-pointer-types warnings
+
+---
+ src/authradius.c | 12 ++++++------
+ src/auto.c       |  2 +-
+ src/conf.c       | 14 +++++++-------
+ src/proxymain.c  |  2 +-
+ src/structures.h |  2 +-
+ 5 files changed, 16 insertions(+), 16 deletions(-)
+
+diff --git a/src/authradius.c b/src/authradius.c
+index 58872b9c..3d86b774 100644
+--- a/src/authradius.c
++++ b/src/authradius.c
+@@ -391,7 +391,7 @@ int radsend(struct clientparam * param, int auth, int stop){
+ 	/* NAS-Identifier */
+ 	if(conf.stringtable){
+ 		*ptr++ = PW_NAS_IDENTIFIER;
+-		len = strlen(conf.stringtable[SERVICES+param->service]);
++		len = strlen((char *)conf.stringtable[SERVICES+param->service]);
+ 		*ptr++ = (2 + len);
+ 		memcpy(ptr, conf.stringtable[SERVICES+param->service], len);
+ 		ptr += len;
+@@ -416,7 +416,7 @@ int radsend(struct clientparam * param, int auth, int stop){
+ 	/* Called-Station-ID */
+ 	if(param->hostname){
+ 		*ptr++ = PW_CALLED_STATION_ID;
+-		len = strlen(param->hostname);
++		len = strlen((char *)param->hostname);
+ 		*ptr++ = (2 + len);
+ 		memcpy(ptr, param->hostname, len);
+ 		ptr += len;
+@@ -456,7 +456,7 @@ int radsend(struct clientparam * param, int auth, int stop){
+ 
+ 	/* Username */
+ 	if(param->username){
+-	    len = strlen(param->username);
++	    len = strlen((char *)param->username);
+ 	    if(len>128)len=128;
+ 	    *ptr++ = PW_USER_NAME;
+ 	    *ptr++ = len + 2;
+@@ -499,12 +499,12 @@ int radsend(struct clientparam * param, int auth, int stop){
+ 	}
+ 	
+ 	if(auth && param->password){
+-    	    len = strlen(param->password);
++	    len = strlen((char *)param->password);
+ 	    if(len > 128) len = 128;
+ 	    *ptr++ = PW_PASSWORD;
+ 	    ptr++;
+ 	    memcpy(ptr, param->password, len);
+-	    rad_pwencode(ptr,
++	    rad_pwencode((char *)ptr,
+ 		     &len,
+ 		     radiussecret, 
+ 		     (char *)packet.vector);
+@@ -582,7 +582,7 @@ int radsend(struct clientparam * param, int auth, int stop){
+ 			continue;
+ 		}
+ 
+-		if (calc_replydigest((char *)&rpacket, packet.vector, radiussecret,
++		if (calc_replydigest((char *)&rpacket, (char *)packet.vector, radiussecret,
+ 			data_len) ){
+ 			continue;
+ 		}
+diff --git a/src/conf.c b/src/conf.c
+index 11ecbfa1..6e4a07b4 100644
+--- a/src/conf.c
++++ b/src/conf.c
+@@ -324,7 +324,7 @@ static int h_log(int argc, unsigned char ** argv){
+ 		}
+ #endif
+ #ifndef NORADIUS
+-		else if(!strcmp(argv[1],"radius")){
++		else if(!strcmp((char *)argv[1],"radius")){
+ 			conf.logfunc = logradius;
+ 		}
+ #endif
+@@ -781,7 +781,7 @@ static int h_parent(int argc, unsigned char **argv){
+ 		myfree(chains);
+ 		return(4);
+ 	}
+-	cidr = strchr(argv[3], '/');
++	cidr = strchr((char *)argv[3], '/');
+ 	if(cidr) *cidr = 0;
+ 	getip46(46, argv[3], (struct sockaddr *)&chains->addr);
+ 	chains->exthost = (unsigned char *)mystrdup((char *)argv[3]);
+@@ -844,7 +844,7 @@ int scanipl(unsigned char *arg, struct iplist *dst){
+ 	memcpy(&dst->ip_from, SAADDR(&sa), SAADDRLEN(&sa));
+ 	dst->family = *SAFAMILY(&sa);
+ 	if(dash){
+-		if(afdetect(dash+1) == -1) return 1;
++		if(afdetect((unsigned char *)dash+1) == -1) return 1;
+ 		if(!getip46(46, (unsigned char *)dash+1, (struct sockaddr *)&sa)) return 2;
+ 		memcpy(&dst->ip_to, SAADDR(&sa), SAADDRLEN(&sa));
+ 		if(*SAFAMILY(&sa) != dst->family || memcmp(&dst->ip_to, &dst->ip_from, SAADDRLEN(&sa)) < 0) return 3;
+@@ -1405,16 +1405,16 @@ static int h_radius(int argc, unsigned char **argv){
+ 	}
+ */
+ 	memset(radiuslist, 0, sizeof(radiuslist));
+-	if(strlen(argv[1]) > 63) argv[1][63] = 0;
+-	strcpy(radiussecret, argv[1]);
++	if(strlen((char *)argv[1]) > 63) argv[1][63] = 0;
++	strcpy(radiussecret, (char *)argv[1]);
+ 	for( nradservers=0; nradservers < MAXRADIUS && nradservers < argc -2; nradservers++){
+ 		char *s = 0;
+-		if((s=strchr(argv[nradservers + 2], '/'))){
++		if((s=strchr((char *)argv[nradservers + 2], '/'))){
+ 			*s = 0;
+ 			s++;
+ 		}
+ 		if( !getip46(46, argv[nradservers + 2], (struct sockaddr *)&radiuslist[nradservers].authaddr)) return 1;
+-		if( s && !getip46(46, s+1, (struct sockaddr *)&radiuslist[nradservers].localaddr)) return 2;
++		if( s && !getip46(46, (unsigned char *)s+1, (struct sockaddr *)&radiuslist[nradservers].localaddr)) return 2;
+ 		if(!*SAPORT(&radiuslist[nradservers].authaddr))*SAPORT(&radiuslist[nradservers].authaddr) = htons(1812);
+ 		port = ntohs(*SAPORT(&radiuslist[nradservers].authaddr));
+ 		radiuslist[nradservers].logaddr = radiuslist[nradservers].authaddr;
+diff --git a/src/structures.h b/src/structures.h
+index db096758..0e3cd27b 100644
+--- a/src/structures.h
++++ b/src/structures.h
+@@ -718,7 +718,7 @@ struct sockfuncs {
+ 	int (*_getsockname)(SOCKET s, struct sockaddr * name, socklen_t * namelen);
+    	int (*_getsockopt)(SOCKET s, int level, int optname, void * optval, socklen_t * optlen);
+ 	int (*_setsockopt)(int s, int level, int optname, const void *optval, socklen_t optlen);
+-	int (*_poll)(struct pollfd *fds, unsigned int nfds, int timeout);
++	int (*_poll)(struct pollfd *fds, long unsigned int nfds, int timeout);
+ 	size_t (*_send)(SOCKET s, const void *msg, size_t len, int flags);
+ 	size_t (*_sendto)(SOCKET s, const void *msg, size_t len, int flags, const struct sockaddr *to, SASIZETYPE tolen);
+ 	size_t (*_recv)(SOCKET s, void *buf, size_t len, int flags);
+
+From f27789c5f66f135207de2a537a9468ea7d5de76f Mon Sep 17 00:00:00 2001
+From: Daniel Winzen <daniel@danwin1210.de>
+Date: Wed, 7 Dec 2022 21:22:01 +0100
+Subject: [PATCH 4/4] Fix more memory leaks
+
+---
+ src/proxymain.c | 40 +++++++++++++++++++++++++++++++++++++++-
+ 1 file changed, 39 insertions(+), 1 deletion(-)
+
+diff --git a/src/proxymain.c b/src/proxymain.c
+index cf208df3..eb92940a 100644
+--- a/src/proxymain.c
++++ b/src/proxymain.c
+@@ -505,7 +505,10 @@ int MODULEMAINFUNC (int argc, char** argv){
+ 			""
+ #endif
+ 		);
+-
++		srvfree(&srv);
++		if(cbc_string)myfree(cbc_string);
++		if(cbl_string)myfree(cbl_string);
++		if(fp) fclose(fp);
+ 		return (1);
+ 	}
+ #endif
+@@ -538,6 +541,10 @@ int MODULEMAINFUNC (int argc, char** argv){
+ 			""
+ #endif
+ 		);
++		srvfree(&srv);
++		if(cbc_string)myfree(cbc_string);
++		if(cbl_string)myfree(cbl_string);
++		if(fp) fclose(fp);
+ 		return (1);
+ 	}
+ 	srv.target = (unsigned char *)mystrdup(argv[i+1]);
+@@ -556,6 +563,10 @@ int MODULEMAINFUNC (int argc, char** argv){
+ 	}
+ 	defparam.clisock = 0;
+ 	if(! (newparam = myalloc (sizeof(defparam)))){
++		srvfree(&srv);
++		if(cbc_string)myfree(cbc_string);
++		if(cbl_string)myfree(cbl_string);
++		if(fp) fclose(fp);
+ 		return 2;
+ 	};
+ 	*newparam = defparam;
+@@ -601,6 +612,9 @@ int MODULEMAINFUNC (int argc, char** argv){
+ 		}
+ 		if( sock == INVALID_SOCKET) {
+ 			perror("socket()");
++			srvfree(&srv);
++			if(cbl_string)myfree(cbl_string);
++			if(fp) fclose(fp);
+ 			return -2;
+ 		}
+ 		setopts(sock, srv.lissockopts);
+@@ -645,6 +668,9 @@ int MODULEMAINFUNC (int argc, char** argv){
+ 		sleeptime = (sleeptime<<1);	
+ 		if(!sleeptime) {
+ 			so._closesocket(sock);
++			srvfree(&srv);
++			if(cbc_string)myfree(cbc_string);
++			if(fp) fclose(fp);
+ 			return -3;
+ 		}
+ 	}
+@@ -652,6 +678,9 @@ int MODULEMAINFUNC (int argc, char** argv){
+ 		if(so._listen (sock, srv.backlog?srv.backlog : 1+(srv.maxchild>>3))==-1) {
+ 			sprintf((char *)buf, "listen(): %s", strerror(errno));
+ 			if(!srv.silent)dolog(&defparam, buf);
++			srvfree(&srv);
++			if(cbc_string)myfree(cbc_string);
++			if(fp) fclose(fp);
+ 			return -4;
+ 		}
+ 	}
+@@ -667,6 +696,9 @@ int MODULEMAINFUNC (int argc, char** argv){
+ 	parsehost(srv.family, cbl_string, (struct sockaddr *)&cbsa);
+ 	if((srv.cbsock=so._socket(SASOCK(&cbsa), SOCK_STREAM, IPPROTO_TCP))==INVALID_SOCKET) {
+ 		dolog(&defparam, (unsigned char *)"Failed to allocate connect back socket");
++		srvfree(&srv);
++		myfree(cbl_string);
++		if(fp) fclose(fp);
+ 		return -6;
+ 	}
+ 	opt = 1;
+@@ -680,10 +712,16 @@ int MODULEMAINFUNC (int argc, char** argv){
+ 
+ 	if(so._bind(srv.cbsock, (struct sockaddr*)&cbsa, SASIZE(&cbsa))==-1) {
+ 		dolog(&defparam, (unsigned char *)"Failed to bind connect back socket");
++		srvfree(&srv);
++		myfree(cbl_string);
++		if(fp) fclose(fp);
+ 		return -7;
+ 	}
+ 	if(so._listen(srv.cbsock, 1 + (srv.maxchild>>4))==-1) {
+ 		dolog(&defparam, (unsigned char *)"Failed to listen connect back socket");
++		srvfree(&srv);
++		myfree(cbl_string);
++		if(fp) fclose(fp);
+ 		return -8;
+ 	}
+  }
+
+--- a/src/proxymain.c
++++ b/src/proxymain.c
+@@ -607,9 +607,15 @@
+ 		so._setsockopt(sock, SOL_SOCKET, SO_REUSEPORT, (char *)&opt, sizeof(int));
+ #endif
+ #ifdef SO_BINDTODEVICE
+-		if(srv.ibindtodevice) so._setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, srv.ibindtodevice, strlen(srv.ibindtodevice) + 1);
++		if(srv.ibindtodevice && so._setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, srv.ibindtodevice, strlen(srv.ibindtodevice) + 1)) {
++      dolog(&defparam, (unsigned char *)"failed to bind device");
++      srvfree(&srv);
++      if(cbc_string)myfree(cbc_string);
++      if(fp) fclose(fp);
++      return -12;
++	  }
+ #endif
+-	}
++  }
+ 	size = sizeof(srv.intsa);
+ 	for(sleeptime = SLEEPTIME * 100; so._bind(sock, (struct sockaddr*)&srv.intsa, SASIZE(&srv.intsa))==-1; usleep(sleeptime)) {
+ 		sprintf((char *)buf, "bind(): %s", strerror(errno));
-- 
GitLab