summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2016-07-03 12:31:10 -0700
committerKaz Kylheku <kaz@kylheku.com>2016-07-03 12:31:10 -0700
commit6f25ce94326137c8871691aea36c33cd45029aa9 (patch)
tree9fde335436f7acc85802c0f75c84efc934f4bef8
parentfe8c22a03ebc386a6867d591c780fb45a77d314a (diff)
downloadtxr-6f25ce94326137c8871691aea36c33cd45029aa9.tar.gz
txr-6f25ce94326137c8871691aea36c33cd45029aa9.tar.bz2
txr-6f25ce94326137c8871691aea36c33cd45029aa9.zip
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.
-rw-r--r--socket.c6
1 files 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;
}