From 7bdb0369d5367bc86b58bda9768ec5553691e673 Mon Sep 17 00:00:00 2001 From: Michael Ortmann Date: Mon, 24 Mar 2025 02:15:37 +0100 Subject: [PATCH 1/2] Tcl_Eval() -> Tcl_EvalObjv() --- src/dns.c | 43 +++++++++++++++++-------------------------- 1 file changed, 17 insertions(+), 26 deletions(-) diff --git a/src/dns.c b/src/dns.c index a47f53bcf..64b2b450d 100644 --- a/src/dns.c +++ b/src/dns.c @@ -278,37 +278,28 @@ void dcc_dnshostbyip(sockname_t *ip) static void dns_tcl_iporhostres(sockname_t *ip, char *hostn, int ok, void *other) { devent_tclinfo_t *tclinfo = (devent_tclinfo_t *) other; - Tcl_DString list; - Tcl_DStringInit(&list); - Tcl_DStringAppendElement(&list, tclinfo->proc); - Tcl_DStringAppendElement(&list, iptostr(&ip->addr.sa)); - Tcl_DStringAppendElement(&list, hostn); - Tcl_DStringAppendElement(&list, ok ? "1" : "0"); - - if (tclinfo->paras) { - EGG_CONST char *argv[2]; - char *output; - - argv[0] = Tcl_DStringValue(&list); - argv[1] = tclinfo->paras; - output = Tcl_Concat(2, argv); - - if (Tcl_Eval(interp, output) == TCL_ERROR) { - putlog(LOG_MISC, "*", DCC_TCLERROR, tclinfo->proc, tcl_resultstring()); - Tcl_BackgroundError(interp); - } - Tcl_Free(output); - } else if (Tcl_Eval(interp, Tcl_DStringValue(&list)) == TCL_ERROR) { + int objc = 0; + Tcl_Obj *objv[5]; + + objv[objc++] = Tcl_NewStringObj(tclinfo->proc, -1); + objv[objc++] = Tcl_NewStringObj(iptostr(&ip->addr.sa), -1); + objv[objc++] = Tcl_NewStringObj(hostn, -1); + objv[objc++] = Tcl_NewStringObj(ok ? "1" : "0", -1); + if (*(tclinfo->paras)) + objv[objc++] = Tcl_NewStringObj(tclinfo->paras, -1); + for (int i = 0; i < objc; i++) { + Tcl_IncrRefCount(objv[i]); + } + if (Tcl_EvalObjv(interp, objc, objv, 0) == TCL_ERROR) { putlog(LOG_MISC, "*", DCC_TCLERROR, tclinfo->proc, tcl_resultstring()); Tcl_BackgroundError(interp); } - - Tcl_DStringFree(&list); - + for (int i = 0; i < objc; i++) { + Tcl_DecrRefCount(objv[i]); + } nfree(tclinfo->proc); - if (tclinfo->paras) - nfree(tclinfo->paras); + nfree(tclinfo->paras); nfree(tclinfo); } From 20c77021f508c938f29acac2b8e84918acd395fc Mon Sep 17 00:00:00 2001 From: Michael Ortmann Date: Mon, 24 Mar 2025 12:16:18 +0100 Subject: [PATCH 2/2] Better leave NULL check in, i wasnt able to trigger NULL case in all my tests, but better safe than sorry --- src/dns.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/dns.c b/src/dns.c index 64b2b450d..e7067a85d 100644 --- a/src/dns.c +++ b/src/dns.c @@ -278,7 +278,6 @@ void dcc_dnshostbyip(sockname_t *ip) static void dns_tcl_iporhostres(sockname_t *ip, char *hostn, int ok, void *other) { devent_tclinfo_t *tclinfo = (devent_tclinfo_t *) other; - int objc = 0; Tcl_Obj *objv[5]; @@ -286,7 +285,7 @@ static void dns_tcl_iporhostres(sockname_t *ip, char *hostn, int ok, void *other objv[objc++] = Tcl_NewStringObj(iptostr(&ip->addr.sa), -1); objv[objc++] = Tcl_NewStringObj(hostn, -1); objv[objc++] = Tcl_NewStringObj(ok ? "1" : "0", -1); - if (*(tclinfo->paras)) + if ((tclinfo->paras) && (*(tclinfo->paras))) objv[objc++] = Tcl_NewStringObj(tclinfo->paras, -1); for (int i = 0; i < objc; i++) { Tcl_IncrRefCount(objv[i]); @@ -299,7 +298,8 @@ static void dns_tcl_iporhostres(sockname_t *ip, char *hostn, int ok, void *other Tcl_DecrRefCount(objv[i]); } nfree(tclinfo->proc); - nfree(tclinfo->paras); + if (tclinfo->paras) + nfree(tclinfo->paras); nfree(tclinfo); }