From: Nikodemus Siivola Date: Fri, 18 Nov 2011 14:21:26 +0000 (+0200) Subject: sb-bsd-sockets: GET-ADDRESS-INFO foreign memory leak X-Git-Url: http://repo.macrolet.net/gitweb/?a=commitdiff_plain;h=78eea0607fb44f620a8192e173f91860d3622967;p=sbcl.git sb-bsd-sockets: GET-ADDRESS-INFO foreign memory leak 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()... --- diff --git a/NEWS b/NEWS index 809a63e..b0ea21f 100644 --- 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, diff --git a/contrib/sb-bsd-sockets/name-service.lisp b/contrib/sb-bsd-sockets/name-service.lisp index 165c215..8e96c7b 100644 --- a/contrib/sb-bsd-sockets/name-service.lisp +++ b/contrib/sb-bsd-sockets/name-service.lisp @@ -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)))))