diff options
author | Christian Pointner <equinox@anytun.org> | 2014-02-11 23:10:11 +0000 |
---|---|---|
committer | Christian Pointner <equinox@anytun.org> | 2014-02-11 23:10:11 +0000 |
commit | 381efd6da6e85fce4a30857aab729bea30d3e1e0 (patch) | |
tree | b50a8c7b18e945d557cbc33f72661944e3036a4e /src/udp.c | |
parent | fixed memory error at udp_endpoint_to_string (diff) |
fixed remote socket resolving
Diffstat (limited to 'src/udp.c')
-rw-r--r-- | src/udp.c | 33 |
1 files changed, 20 insertions, 13 deletions
@@ -236,20 +236,27 @@ int udp_resolv_remote(udp_t* sock, const char* remote_addr, const char* port, re return -1; } - if(!sock->active_sock_) { - udp_socket_t* s = sock->socks_; - while(s) { - if(s->local_end_.addr_.ss_family == res->ai_family) { - sock->active_sock_ = s; - break; + struct addrinfo* r = res; + while(r) { + if(!sock->active_sock_) { + udp_socket_t* s = sock->socks_; + while(s) { + if(s->local_end_.addr_.ss_family == r->ai_family) { + sock->active_sock_ = s; + break; + } + s = s->next_; } - s = s->next_; } - } - if(sock->active_sock_) { - memcpy(&(sock->active_sock_->remote_end_.addr_), res->ai_addr, res->ai_addrlen); - sock->active_sock_->remote_end_.len_ = res->ai_addrlen; - sock->active_sock_->remote_end_set_ = 1; + + if(sock->active_sock_) { + memcpy(&(sock->active_sock_->remote_end_.addr_), r->ai_addr, r->ai_addrlen); + sock->active_sock_->remote_end_.len_ = r->ai_addrlen; + sock->active_sock_->remote_end_set_ = 1; + break; + } + + r = r->ai_next; } freeaddrinfo(res); @@ -332,7 +339,7 @@ char* udp_endpoint_to_string(udp_endpoint_t* e) char* udp_get_remote_end_string(udp_t* sock) { - if(!sock || !sock->active_sock_ || !sock->active_sock_->remote_end_set_) + if(!sock || !(sock->active_sock_) || !(sock->active_sock_->remote_end_set_)) return NULL; return udp_endpoint_to_string(&(sock->active_sock_->remote_end_)); |