diff --git a/CHANGELOG b/CHANGELOG index 49ae165d2..61e9712ac 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,9 @@ # Nmap Changelog ($Id$); -*-text-*- +o Added checks that the argument to freeaddrinfo is not NULL, avoiding + a segmentation fault on Android and possibly other platforms. + Suggested by Vlatko Kosturjak and Alexismm2. + o [Zenmap] Worked around a pycairo bug that prevented saving the topology graphic as PNG on Windows: "Error Saving Snapshot: Surface.write_to_png takes one argument which must be a filename diff --git a/TargetGroup.cc b/TargetGroup.cc index a59a85837..d4e54ab0b 100644 --- a/TargetGroup.cc +++ b/TargetGroup.cc @@ -220,7 +220,8 @@ int TargetGroup::parse_expr(const char * const target_expr, int af) { resolvedaddrs.push_back(ss); } } - freeaddrinfo(addrs); + if (addrs != NULL) + freeaddrinfo(addrs); if (resolvedaddrs.empty()) { error("Failed to resolve given hostname/IP: %s. Note that you can't use '/mask' AND '1-4,7,100-' style IP ranges", target_net); @@ -330,7 +331,8 @@ int TargetGroup::parse_expr(const char * const target_expr, int af) { resolvedaddrs.push_back(ss); } } - freeaddrinfo(addrs); + if (addrs != NULL) + freeaddrinfo(addrs); if (resolvedaddrs.empty()) { error("Failed to resolve given IPv6 hostname/IP: %s. Note that you can't use '/mask' or '[1-4,7,100-]' style ranges for IPv6.", hostexp); diff --git a/nse_nmaplib.cc b/nse_nmaplib.cc index b793428aa..41be93cc6 100644 --- a/nse_nmaplib.cc +++ b/nse_nmaplib.cc @@ -724,7 +724,8 @@ static int l_resolve(lua_State *L) lua_rawseti(L, -2, i++); } - freeaddrinfo(addrs); + if (addrs != NULL) + freeaddrinfo(addrs); return 2; } diff --git a/nse_nsock.cc b/nse_nsock.cc index 491d8915a..75a7c8b08 100644 --- a/nse_nsock.cc +++ b/nse_nsock.cc @@ -576,7 +576,8 @@ static int l_connect (lua_State *L) break; } - freeaddrinfo(dest); + if (dest != NULL) + freeaddrinfo(dest); return yield(L, nu, "CONNECT", TO, 0, NULL); } diff --git a/tcpip.cc b/tcpip.cc index de3fb9bfe..d82171210 100644 --- a/tcpip.cc +++ b/tcpip.cc @@ -357,7 +357,7 @@ const char *inet_socktop(struct sockaddr_storage *ss) { /* Tries to resolve the given name (or literal IP) into a sockaddr structure. This function calls getaddrinfo and returns the same addrinfo linked list that getaddrinfo produces. Returns NULL for any error or failure to resolve. - You need to call freeaddrinfo on the result. */ + You need to call freeaddrinfo on the result if non-NULL. */ struct addrinfo *resolve_all(char *hostname, int pf) { struct addrinfo hints;