Changeset e68221b in code for dns.c


Ignore:
Timestamp:
Jun 23, 2014, 1:02:33 PM (11 years ago)
Author:
Florian Obser <florian@…>
Branches:
master
Children:
96a2e31
Parents:
120eedd
Message:

Check that the reverse resolved hostname resolves back to the
connecting IP.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • dns.c

    r120eedd re68221b  
    3535void dns_done_host(struct asr_result *, void *);
    3636void dns_done_reverse(struct asr_result *, void *);
     37int  cmp_addr(struct sockaddr *, struct sockaddr *);
    3738
    3839extern int dodns;
     
    4243{
    4344        struct icb_session *is = arg;
     45        struct addrinfo *res;
     46        int found = 0;
    4447
    45         if (ar->ar_addrinfo)
    46                 freeaddrinfo(ar->ar_addrinfo);
    47 
    48         /* just check that there's no error */
    4948        if (ar->ar_gai_errno == 0) {
    5049                if (strncmp(is->hostname, "localhost",
    5150                    sizeof "localhost" - 1) == 0)
    5251                        strlcpy(is->host, "unknown", ICB_MAXHOSTLEN);
    53                 else if (strlen(is->hostname) < ICB_MAXHOSTLEN)
    54                         strlcpy(is->host, is->hostname, ICB_MAXHOSTLEN);
     52                else if (strlen(is->hostname) < ICB_MAXHOSTLEN) {
     53                        for (res = ar->ar_addrinfo; res; res = res->ai_next) {
     54                                if (cmp_addr(res->ai_addr, (struct sockaddr *)
     55                                    &is->ss) == 0) {
     56                                        strlcpy(is->host, is->hostname,
     57                                            ICB_MAXHOSTLEN);
     58                                        found = 1;
     59                                        break;
     60                                }
     61                        }
     62                        if (!found)
     63                                icbd_log(is, LOG_WARNING, "hostname %s does "
     64                                   "not resolve back to connecting ip %s",
     65                                    is->hostname, is->host);
     66                }
    5567        } else
    5668                icbd_log(is, LOG_WARNING, "dns resolution failed: %s",
    5769                    gai_strerror(ar->ar_gai_errno));
     70
     71        if (ar->ar_addrinfo)
     72                freeaddrinfo(ar->ar_addrinfo);
    5873
    5974        if (ISSETF(is->flags, ICB_SF_PENDINGDROP)) {
     
    92107}
    93108
     109int
     110cmp_addr(struct sockaddr *a, struct sockaddr *b)
     111{
     112        if (a->sa_family != b->sa_family)
     113                return (a->sa_family - b->sa_family);
     114
     115        if (a->sa_family == AF_INET)
     116                return (((struct sockaddr_in *)a)->sin_addr.s_addr -
     117                    ((struct sockaddr_in *)b)->sin_addr.s_addr);
     118
     119        if (a->sa_family == AF_INET6)
     120                return (memcmp(&((struct sockaddr_in6 *)a)->sin6_addr,
     121                    &((struct sockaddr_in6 *)b)->sin6_addr,
     122                    sizeof (struct in6_addr)));
     123
     124        return -1;
     125       
     126}
     127
    94128void
    95 dns_resolve(struct icb_session *is, struct sockaddr *sa)
     129dns_resolve(struct icb_session *is)
    96130{
    97131        struct asr_query *as;
     
    105139                icbd_log(is, LOG_DEBUG, "resolving: %s", is->host);
    106140
    107         as = getnameinfo_async(sa, sa->sa_len, is->hostname,
     141        as = getnameinfo_async((struct sockaddr *)&is->ss,
     142            ((struct sockaddr *)&is->ss)->sa_len, is->hostname,
    108143            sizeof is->hostname, NULL, 0, NI_NOFQDN, NULL);
    109144        event_asr_run(as, dns_done_reverse, is);
Note: See TracChangeset for help on using the changeset viewer.