Changeset e68221b in code


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.

Files:
4 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);
  • icb.h

    r120eedd re68221b  
    1616
    1717#include <sys/queue.h>
     18#include <sys/socket.h>
    1819
    1920/*
     
    7879        char                     hostname[MAXHOSTNAMELEN];
    7980        char                     buffer[ICB_MSGSIZE];
     81        struct sockaddr_storage  ss;
    8082        struct event             ev;
    8183        struct bufferevent      *bev;
  • icbd.c

    r120eedd re68221b  
    586586getpeerinfo(struct icb_session *is)
    587587{
    588         struct sockaddr_storage ss;
    589         struct sockaddr_in *sin = (struct sockaddr_in *)&ss;
    590         struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&ss;
    591         socklen_t ss_len = sizeof ss;
    592 
    593         bzero(&ss, sizeof ss);
    594         if (getpeername(EVBUFFER_FD(is->bev), (struct sockaddr *)&ss,
     588        struct sockaddr_in *sin = (struct sockaddr_in *)&is->ss;
     589        struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&is->ss;
     590        socklen_t ss_len = sizeof is->ss;
     591
     592        bzero(&is->ss, sizeof is->ss);
     593        if (getpeername(EVBUFFER_FD(is->bev), (struct sockaddr *)&is->ss,
    595594            &ss_len) != 0)
    596595                return;
    597596
    598597        is->port = 0;
    599         switch (ss.ss_family) {
     598        switch (is->ss.ss_family) {
    600599        case AF_INET:
    601600                is->port = ntohs(sin->sin_port);
     
    607606        }
    608607
    609         inet_ntop(ss.ss_family, ss.ss_family == AF_INET ?
     608        inet_ntop(is->ss.ss_family, is->ss.ss_family == AF_INET ?
    610609            (void *)&sin->sin_addr : (void *)&sin6->sin6_addr,
    611610            is->host, sizeof is->host);
    612611
    613         dns_resolve(is, (struct sockaddr *)&ss);
    614 }
     612        dns_resolve(is);
     613}
  • icbd.h

    r120eedd re68221b  
    3232
    3333/* dns.c */
    34 struct sockaddr;
    35 void            dns_resolve(struct icb_session *, struct sockaddr *);
     34void            dns_resolve(struct icb_session *);
    3635
    3736/* logger.c */
Note: See TracChangeset for help on using the changeset viewer.