Skip to content

Commit

Permalink
Fix getaddrinfo under solaris (for multiprotocol case)
Browse files Browse the repository at this point in the history
During testing on solaris 11.3, util/getaddrinfo failed at:
  memset(&hints, 0, sizeof(hints));
  hints.ai_flags = EVUTIL_AI_NUMERICHOST;
  r = evutil_getaddrinfo("1.2.3.4", NULL, &hints, &ai);
  tt_assert(ai_find_by_protocol(ai, IPPROTO_TCP));

And this is because solaris's getaddrinfo() returns:
$6 = {
  ai_flags = 32,
  ai_family = 2,
  ai_socktype = 0,
  ai_protocol = 0, <-- no proto
  ai_addrlen = 16,
  ai_canonname = 0x0,
  ai_addr = 0x815d658,
  ai_next = 0x0 <-- nothing else
}

So we should emulate this too.

Plus introduce helper that will search through all results, not only first one.

Fixes: util/getaddrinfo
Fixes: #354
  • Loading branch information
Azat Khuzhin authored and azat committed Aug 10, 2016
1 parent dc95823 commit 40730ae
Showing 1 changed file with 14 additions and 2 deletions.
16 changes: 14 additions & 2 deletions evutil.c
Original file line number Diff line number Diff line change
Expand Up @@ -1238,11 +1238,20 @@ static int tested_for_getaddrinfo_hacks=0;
field set to 0. We test for this so we can apply an appropriate
workaround.
*/
struct evutil_addrinfo *ai_find_protocol(struct evutil_addrinfo *ai)
{
while (ai) {
if (ai->ai_protocol)
return ai;
ai = ai->ai_next;
}
return NULL;
}
static void
test_for_getaddrinfo_hacks(void)
{
int r, r2;
struct evutil_addrinfo *ai=NULL, *ai2=NULL;
struct evutil_addrinfo *ai=NULL, *ai2=NULL, *ai3=NULL;
struct evutil_addrinfo hints;

memset(&hints,0,sizeof(hints));
Expand All @@ -1256,19 +1265,22 @@ test_for_getaddrinfo_hacks(void)
#endif
0;
r = getaddrinfo("1.2.3.4", "80", &hints, &ai);
getaddrinfo("1.2.3.4", NULL, &hints, &ai3);
hints.ai_socktype = SOCK_STREAM;
r2 = getaddrinfo("1.2.3.4", "80", &hints, &ai2);
if (r2 == 0 && r != 0) {
need_numeric_port_hack_=1;
}
if (ai2 && ai2->ai_protocol == 0) {
if (!ai_find_protocol(ai2) || !ai_find_protocol(ai3)) {
need_socktype_protocol_hack_=1;
}

if (ai)
freeaddrinfo(ai);
if (ai2)
freeaddrinfo(ai2);
if (ai3)
freeaddrinfo(ai3);
tested_for_getaddrinfo_hacks=1;
}

Expand Down

0 comments on commit 40730ae

Please sign in to comment.