diff options
Diffstat (limited to 'libbb')
-rw-r--r-- | libbb/xconnect.c | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/libbb/xconnect.c b/libbb/xconnect.c index cb5ac2c8e..91c12f4d3 100644 --- a/libbb/xconnect.c +++ b/libbb/xconnect.c | |||
@@ -125,6 +125,7 @@ USE_FEATURE_IPV6(sa_family_t af,) | |||
125 | int rc; | 125 | int rc; |
126 | len_and_sockaddr *r = NULL; | 126 | len_and_sockaddr *r = NULL; |
127 | struct addrinfo *result = NULL; | 127 | struct addrinfo *result = NULL; |
128 | struct addrinfo *used_res; | ||
128 | const char *org_host = host; /* only for error msg */ | 129 | const char *org_host = host; /* only for error msg */ |
129 | const char *cp; | 130 | const char *cp; |
130 | struct addrinfo hint; | 131 | struct addrinfo hint; |
@@ -169,9 +170,21 @@ USE_FEATURE_IPV6(sa_family_t af,) | |||
169 | xfunc_die(); | 170 | xfunc_die(); |
170 | goto ret; | 171 | goto ret; |
171 | } | 172 | } |
172 | r = xmalloc(offsetof(len_and_sockaddr, sa) + result->ai_addrlen); | 173 | used_res = result; |
173 | r->len = result->ai_addrlen; | 174 | #if ENABLE_FEATURE_PREFER_IPV4_ADDRESS |
174 | memcpy(&r->sa, result->ai_addr, result->ai_addrlen); | 175 | while (1) { |
176 | if (used_res->ai_family == AF_INET) | ||
177 | break; | ||
178 | used_res = used_res->ai_next; | ||
179 | if (!used_res) { | ||
180 | used_res = result; | ||
181 | break; | ||
182 | } | ||
183 | } | ||
184 | #endif | ||
185 | r = xmalloc(offsetof(len_and_sockaddr, sa) + used_res->ai_addrlen); | ||
186 | r->len = used_res->ai_addrlen; | ||
187 | memcpy(&r->sa, used_res->ai_addr, used_res->ai_addrlen); | ||
175 | set_nport(r, htons(port)); | 188 | set_nport(r, htons(port)); |
176 | ret: | 189 | ret: |
177 | freeaddrinfo(result); | 190 | freeaddrinfo(result); |