diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2016-07-03 12:31:10 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2016-07-03 12:31:10 -0700 |
commit | 6f25ce94326137c8871691aea36c33cd45029aa9 (patch) | |
tree | 9fde335436f7acc85802c0f75c84efc934f4bef8 /socket.c | |
parent | fe8c22a03ebc386a6867d591c780fb45a77d314a (diff) | |
download | txr-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.
Diffstat (limited to 'socket.c')
-rw-r--r-- | socket.c | 6 |
1 files changed, 4 insertions, 2 deletions
@@ -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; } |