Fix UDP and TCP port byte order in saved options.
authorNick Alcock <nick.alcock@oracle.com>
Mon, 21 May 2012 14:25:07 +0000 (16:25 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Mon, 21 May 2012 20:40:45 +0000 (22:40 +0200)
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.

ares_init.c

index 823bef555b5291dadb1783c4024f226ca2856d83..ccdc07a1ac750691785e8e13817dd75d61fc55ac 100644 (file)
@@ -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;