sb-bsd-sockets: GET-ADDRESS-INFO foreign memory leak
authorNikodemus Siivola <nikodemus@sb-studio.net>
Fri, 18 Nov 2011 14:21:26 +0000 (16:21 +0200)
committerNikodemus Siivola <nikodemus@sb-studio.net>
Fri, 18 Nov 2011 15:18:30 +0000 (17:18 +0200)
  Two issues:

   * We were using MAKE-ALIEN and not freeing the memory.

   * We were calling FREE-ADDRINFO, not FREEADDRINFO: the first is an
     SB-GROVEL generated deallocator, the second is freeaddrinfo()...

NEWS
contrib/sb-bsd-sockets/name-service.lisp

diff --git a/NEWS b/NEWS
index 809a63e..b0ea21f 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -24,7 +24,10 @@ changes relative to sbcl-1.0.53:
     result in fasl-dumping internal type objects. (lp#890750)
   * bug fix: type mismatch on (setf aref) and function return values no
     longer result in fasl-dumping internal type objects.
-  * bug fix: SB-BSD-SOCKETS:GET-PROTOCOL-BY-NAME leaked foreign memory.
+  * bug fix: SB-BSD-SOCKETS foreign memory leaks
+    ** GET-PROTOCOL-BY-NAME had a significant leak.
+    ** GET-HOST-BY-NAME and GET-HOST-BY-ADDRESS leaked 1 word per call on
+       systems providing getaddrinfo().
 
 changes in sbcl-1.0.53 relative to sbcl-1.0.52:
   * enhancement: on 64-bit targets, in src/compiler/generic/early-vm.lisp,
index 165c215..8e96c7b 100644 (file)
@@ -90,9 +90,9 @@ weird stuff - see gethostbyname(3) or getaddrinfo(3) for the details."
 
 #+sb-bsd-sockets-addrinfo
 (defun get-address-info (node)
-  (sb-alien:with-alien ((res (* (* sockint::addrinfo)) :local
-                             (sb-alien:make-alien (* sockint::addrinfo))))
-    (let ((err (sockint::getaddrinfo node nil nil res)))
+  (sb-alien:with-alien ((buf (sb-alien:array (* sockint::addrinfo) 1)))
+    (let* ((res (sb-alien:addr (sb-alien:deref buf 0)))
+           (err (sockint::getaddrinfo node nil nil res)))
       (if (zerop err)
           (let ((host-ent (make-instance 'host-ent
                                          :name node
@@ -114,7 +114,7 @@ weird stuff - see gethostbyname(3) or getaddrinfo(3) for the details."
                                                                          4)
                                        (host-ent-addresses host-ent)
                                        :test 'equalp)))))
-            (sockint::free-addrinfo (sb-alien:deref res))
+            (sockint::freeaddrinfo (sb-alien:deref res))
             host-ent)
           (addrinfo-error "getaddrinfo" err)))))