From 25d7694334c237b0a5491fc07bf8f61650d72f0d Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Sun, 3 Jul 2016 12:31:10 -0700 Subject: Fix crash in getaddrinfo. * socket.c (getaddrinfo_wrap): Initialize alist to null, because getaddrinfo doesn't set it in the failure case! Then, avoid calling freeaddrinfo for null pointer; POSIX doesn't require that to work. --- socket.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/socket.c b/socket.c index 9f17b09f..d1589d3b 100644 --- a/socket.c +++ b/socket.c @@ -170,7 +170,7 @@ static val getaddrinfo_wrap(val node_in, val service_in, val hints_in) val node = default_arg(node_in, nil); val service = default_arg(service_in, nil); val hints = default_arg(hints_in, nil); - struct addrinfo hints_ai, *phints = hints ? &hints_ai : 0, *alist, *aiter; + struct addrinfo hints_ai, *phints = hints ? &hints_ai : 0, *alist = 0, *aiter; char *node_u8 = stringp(node) ? utf8_dup_to(c_str(node)) : 0; char *service_u8 = stringp(service) ? utf8_dup_to(c_str(service)) : 0; val node_num_p = integerp(node); @@ -221,7 +221,9 @@ static val getaddrinfo_wrap(val node_in, val service_in, val hints_in) } } - freeaddrinfo(alist); + /* Stupidly, POSIX doesn't require freeaddrinfo(0) to work. */ + if (alist) + freeaddrinfo(alist); return out; } -- cgit v1.2.3