[torsocks/master] gethostbyaddr_r: Don't put garbage in data->hostname

commit 8013dfb1ebf6cb1d0a8751dcd3531e6b2e5aef39 Author: David Goulet <dgoulet@torproject.org> Date: Fri Apr 20 12:04:35 2018 -0400 gethostbyaddr_r: Don't put garbage in data->hostname Fixes #25627 Signed-off-by: David Goulet <dgoulet@torproject.org> --- src/lib/gethostbyname.c | 5 ++++- tests/test_dns.c | 24 +++++++++++++++++++++++- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/lib/gethostbyname.c b/src/lib/gethostbyname.c index 296099e..df84e14 100644 --- a/src/lib/gethostbyname.c +++ b/src/lib/gethostbyname.c @@ -263,9 +263,12 @@ LIBC_GETHOSTBYADDR_R_RET_TYPE tsocks_gethostbyaddr_r(LIBC_GETHOSTBYADDR_R_SIG) /* This call allocates hostname. On error, it's untouched. */ ret = tsocks_tor_resolve_ptr(addr, &data->hostname, type); if (ret < 0) { + /* We can represent any IPv4 address in dotted quad notation in fewer than + * 32 bytes (max should be 16 if we count a nul terminator). */ + char addrbuf[32]; const char *ret_str; - ret_str = inet_ntop(type, addr, buf, buflen); + ret_str = inet_ntop(type, addr, &addrbuf[0], sizeof(addrbuf)); if (!ret_str) { ret = HOST_NOT_FOUND; if (errno == ENOSPC) { diff --git a/tests/test_dns.c b/tests/test_dns.c index 06fad12..7e07663 100644 --- a/tests/test_dns.c +++ b/tests/test_dns.c @@ -26,7 +26,7 @@ #include <tap/tap.h> #include "helpers.h" -#define NUM_TESTS 5 +#define NUM_TESTS 6 struct test_host { const char *name; @@ -76,6 +76,27 @@ static void test_gethostbyname(const struct test_host *host) return; } +static void test_gethostbyaddr_r_failed(void) +{ + int result; + in_addr_t addr; + struct hostent ret; + char buf[1024]; + int buflen = sizeof buf; + struct hostent *result_entp; + int h_errno; + + diag("gethostbyaddr_r test"); + + /* RFC 6890 - An address from TEST-NET-1. Selected in hopes that it will + + * _not_ reverse resolve to anything. + + */ + addr = inet_addr("192.0.2.1"); + result = gethostbyaddr_r((const void *)&addr, + INET_ADDRSTRLEN, AF_INET, &ret, buf, buflen, &result_entp, &h_errno); + ok(0 != result, "Impossible reverse resolve failed as desired."); +} + static void test_gethostbyaddr_r(const struct test_host *host) { int result; @@ -179,6 +200,7 @@ int main(int argc, char **argv) test_gethostbyname(&tor_dir_auth1); test_gethostbyaddr(&tor_dir_auth2); test_gethostbyaddr_r(&tor_dir_auth2); + test_gethostbyaddr_r_failed(); test_getaddrinfo(&tor_localhost); end:
participants (1)
-
dgoulet@torproject.org