Ticket #25627: gethostbyaddr_r.patch

File gethostbyaddr_r.patch, 2.1 KB (added by exarkun, 21 months ago)

Patch with test and fix

  • src/lib/gethostbyname.c

    diff --git a/src/lib/gethostbyname.c b/src/lib/gethostbyname.c
    index 296099e..e5f4a72 100644
    a b LIBC_GETHOSTBYADDR_R_RET_TYPE tsocks_gethostbyaddr_r(LIBC_GETHOSTBYADDR_R_SIG) 
    263263        /* This call allocates hostname. On error, it's untouched. */
    264264        ret = tsocks_tor_resolve_ptr(addr, &data->hostname, type);
    265265        if (ret < 0) {
     266                /* We can represent any IPv4 address in dotted quad notation in
     267                * fewer than 32 bytes (max should be 16 if we count a nul
     268                * terminator).
     269                */
     270                char addrbuf[32];
    266271                const char *ret_str;
    267272
    268                 ret_str = inet_ntop(type, addr, buf, buflen);
     273                ret_str = inet_ntop(type, addr, &addrbuf[0], sizeof addrbuf);
    269274                if (!ret_str) {
    270275                        ret = HOST_NOT_FOUND;
    271276                        if (errno == ENOSPC) {
  • tests/test_dns.c

    diff --git a/tests/test_dns.c b/tests/test_dns.c
    index 0c1eacf..f132767 100644
    a b  
    2626#include <tap/tap.h>
    2727#include "helpers.h"
    2828
    29 #define NUM_TESTS 5
     29#define NUM_TESTS 6
    3030
    3131struct test_host {
    3232        const char *name;
    static void test_gethostbyname(const struct test_host *host) 
    7676        return;
    7777}
    7878
     79static void test_gethostbyaddr_r_failed() {
     80  int result;
     81  in_addr_t addr;
     82  struct hostent ret;
     83  char buf[1024];
     84  int buflen = sizeof buf;
     85  struct hostent *result_entp;
     86  int h_errno;
     87
     88  diag("gethostbyaddr_r test");
     89
     90  /* RFC 6890 - An address from TEST-NET-1.  Selected in hopes that it will
     91   * _not_ reverse resolve to anything.
     92   */
     93  addr = inet_addr("192.0.2.1");
     94  result = gethostbyaddr_r(
     95                       (const void *)&addr,
     96                       INET_ADDRSTRLEN,
     97                       AF_INET,
     98                       &ret,
     99                       buf,
     100                       buflen,
     101                       &result_entp,
     102                       &h_errno
     103                       );
     104  ok(0 != result, "Impossible reverse resolve failed as desired.");
     105}
     106
    79107static void test_gethostbyaddr_r(const struct test_host *host) {
    80108  int result;
    81109  in_addr_t addr;
    int main(int argc, char **argv) 
    187215        test_gethostbyname(&tor_dir_auth1);
    188216        test_gethostbyaddr(&tor_dir_auth2);
    189217        test_gethostbyaddr_r(&tor_dir_auth2);
     218        test_gethostbyaddr_r_failed();
    190219        test_getaddrinfo(&tor_localhost);
    191220
    192221end: