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(¶m->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(¶m->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