Skip to content

Commit

Permalink
threaded-resolver: shutdown the resolver thread without error message
Browse files Browse the repository at this point in the history
When a transfer is done, the resolver thread will be brought down. That
could accidentally generate an error message in the error buffer even
though this is not an error situationand the transfer would still return
OK.  An application that still reads the error buffer could find a
"Could not resolve host: [host name]" message there and get confused.

Reported-by: Michael Schmid
Fixes curl#3629
Closes curl#3630
  • Loading branch information
bagder committed Mar 1, 2019
1 parent 8f105b0 commit 754ae10
Showing 1 changed file with 38 additions and 30 deletions.
68 changes: 38 additions & 30 deletions lib/asyn-thread.c
Original file line number Diff line number Diff line change
Expand Up @@ -461,6 +461,42 @@ static CURLcode resolver_error(struct connectdata *conn)
return result;
}

static CURLcode thread_wait_resolv(struct connectdata *conn,
struct Curl_dns_entry **entry,
bool report)
{
struct thread_data *td = (struct thread_data*) conn->async.os_specific;
CURLcode result = CURLE_OK;

DEBUGASSERT(conn && td);
DEBUGASSERT(td->thread_hnd != curl_thread_t_null);

/* wait for the thread to resolve the name */
if(Curl_thread_join(&td->thread_hnd)) {
if(entry)
result = getaddrinfo_complete(conn);
}
else
DEBUGASSERT(0);

conn->async.done = TRUE;

if(entry)
*entry = conn->async.dns;

if(!conn->async.dns && report)
/* a name was not resolved, report error */
result = resolver_error(conn);

destroy_async_data(&conn->async);

if(!conn->async.dns && report)
connclose(conn, "asynch resolve failed");

return result;
}


/*
* Until we gain a way to signal the resolver threads to stop early, we must
* simply wait for them and ignore their results.
Expand All @@ -473,7 +509,7 @@ void Curl_resolver_kill(struct connectdata *conn)
unfortunately. Otherwise, we can simply cancel to clean up any resolver
data. */
if(td && td->thread_hnd != curl_thread_t_null)
(void)Curl_resolver_wait_resolv(conn, NULL);
(void)thread_wait_resolv(conn, NULL, FALSE);
else
Curl_resolver_cancel(conn);
}
Expand All @@ -494,35 +530,7 @@ void Curl_resolver_kill(struct connectdata *conn)
CURLcode Curl_resolver_wait_resolv(struct connectdata *conn,
struct Curl_dns_entry **entry)
{
struct thread_data *td = (struct thread_data*) conn->async.os_specific;
CURLcode result = CURLE_OK;

DEBUGASSERT(conn && td);
DEBUGASSERT(td->thread_hnd != curl_thread_t_null);

/* wait for the thread to resolve the name */
if(Curl_thread_join(&td->thread_hnd)) {
if(entry)
result = getaddrinfo_complete(conn);
}
else
DEBUGASSERT(0);

conn->async.done = TRUE;

if(entry)
*entry = conn->async.dns;

if(!conn->async.dns)
/* a name was not resolved, report error */
result = resolver_error(conn);

destroy_async_data(&conn->async);

if(!conn->async.dns)
connclose(conn, "asynch resolve failed");

return result;
return thread_wait_resolv(conn, entry, TRUE);
}

/*
Expand Down

0 comments on commit 754ae10

Please sign in to comment.