aports/testing/3proxy/gcc14.patch

1009 lines
35 KiB
Diff

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));