Package: nstx
Version: 1.1-beta6
Severity: Grave
tags: patch

nstxd leaks like a sieve. As it is intended as a long running service
this makes it mostly unusable (and has caused a server of mine to lockup
and lose unrelated data).

This patch appears to ccorrect the problem in my case, and twiddles a
few trivial things. I have not checked for leaks in nstxcd.

Matthew W. S. Bell
diff -ruN nstx-1.1-beta6/nstxd.c nstx-1.1-beta6.new/nstxd.c
--- nstx-1.1-beta6/nstxd.c	2007-10-10 15:14:39.000000000 +0100
+++ nstx-1.1-beta6.new/nstxd.c	2007-10-10 00:58:48.000000000 +0100
@@ -179,7 +179,8 @@
 
 void nstx_getpacket (void) {
    int len, link;
-   const char *name, *buf, *data;
+   const char *name, *inbuf, *data;
+   char *outbuf = NULL;
    struct nstxmsg *msg;
    struct nstxqueue *qitem;
    struct dnspkt *pkt;
@@ -198,9 +199,9 @@
 			name);
 		  queueitem(pkt->id, name, &msg->peer);
 		  if ((data = dns_fqdn2data(name)) &&
-		      (buf = nstx_decode((unsigned char*)data, &len)))
+		      (inbuf = nstx_decode((unsigned char*)data, &len)))
 		    {
-		       nstx_handlepacket(buf, len, &sendtun);
+		       nstx_handlepacket(inbuf, len, &sendtun);
 		    }
 	       }
 	     dns_free(pkt);
@@ -218,10 +219,12 @@
       dns_settype(pkt, DNS_RESPONSE);
       link = dns_addquery(pkt, qitem->name);
       len = dns_getfreespace(pkt, DNS_RESPONSE);
-      buf = dequeue_senditem(&len);
-      dns_addanswer(pkt, buf, len, link);
-      buf = (char*)dns_constructpacket(pkt, &len);
-      sendns(buf, len, &qitem->peer);
+      outbuf = dequeue_senditem(&len);
+      dns_addanswer(pkt, outbuf, len, link);
+      outbuf = (char*)dns_constructpacket(pkt, &len);
+      sendns(outbuf, len, &qitem->peer);
+      free(outbuf);
+      free(qitem);
    }
    timeoutqueue(do_timeout);
 }
diff -ruN nstx-1.1-beta6/nstx_dns.c nstx-1.1-beta6.new/nstx_dns.c
--- nstx-1.1-beta6/nstx_dns.c	2007-10-10 15:14:39.000000000 +0100
+++ nstx-1.1-beta6.new/nstx_dns.c	2007-10-09 23:24:09.000000000 +0100
@@ -450,7 +450,7 @@
       ptr += list->len;
    }
    *l = len;
-   dns_free (pkt);
+   dns_free(pkt);
    return buf;
 }
 
@@ -505,7 +505,7 @@
      {
 	if (remain < 12)
 	  {
-	     syslog(LOG_ERR, "dns_extractpkt: too less bytes in an\n");
+	     syslog(LOG_ERR, "dns_extractpkt: too few bytes in an\n");
 	     free(offsets);
 	     dns_free(pkt);
 	     return NULL;
@@ -530,6 +530,7 @@
 	  {
 	     syslog(LOG_ERR, "dns_extractpkt: record too long in an (%d->%d)\n",
 		    remain, rrp->len);
+	     free(offsets);
 	     dns_free(pkt);
 	     return NULL;
 	  }
@@ -538,6 +539,7 @@
 	ptr += rrp->len;
 	remain -= rrp->len;
      }
+   free(offsets);
    return pkt;
 }
 
diff -ruN nstx-1.1-beta6/nstx_queue.c nstx-1.1-beta6.new/nstx_queue.c
--- nstx-1.1-beta6/nstx_queue.c	2004-06-27 22:43:34.000000000 +0100
+++ nstx-1.1-beta6.new/nstx_queue.c	2007-10-10 00:35:22.000000000 +0100
@@ -59,8 +59,6 @@
 
    if (!qhead)
      return NULL;
-   if (tmp)
-     free(tmp);
 
    if ((id < 0) || (qhead->id == id))
      {

Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to