Browse files

Fix UDP and TCP port byte order in saved options.

The UDP and TCP port are stored in network byte order in the
ares_channeldata, but are passed in to ares_init_options() in host byte
order.  Thus we must return them from ares_save_options() in host byte
order too, or a duplicated channel will convert them again, leading to a
nonfunctional channel and a mysterious connection refused error from
ares_gethostbyname().  This breaks ares_dup(), thus the curl easy API
when c-ares is used by curl, and thus all the curl easy API's users.
  • Loading branch information...
1 parent 7ec5e8e commit 9bd38a4a6e3cc0ffc83585eb41650e300323fb04 Nick Alcock committed with bagder May 21, 2012
Showing with 2 additions and 2 deletions.
  1. +2 −2 ares_init.c
@@ -355,8 +355,8 @@ int ares_save_options(ares_channel channel, struct ares_options *options,
options->timeout = channel->timeout;
options->tries = channel->tries;
options->ndots = channel->ndots;
- options->udp_port = (unsigned short)channel->udp_port;
- options->tcp_port = (unsigned short)channel->tcp_port;
+ options->udp_port = (unsigned short)ntohs(channel->udp_port);
+ options->tcp_port = (unsigned short)ntohs(channel->tcp_port);
options->sock_state_cb = channel->sock_state_cb;
options->sock_state_cb_data = channel->sock_state_cb_data;

0 comments on commit 9bd38a4

Please sign in to comment.