efl_net_dialer_http: fix delete-from-CURL callback.

This was annoying to identify as the sequence is kinda difficult to
get, but Terminology was doing a HEAD request and it was triggering
this case in particular.

Fixes T4975.
This commit is contained in:
Gustavo Sverzut Barbieri 2016-12-09 22:10:28 -02:00
parent 7605fbc9d0
commit 2945b972ef
1 changed files with 37 additions and 24 deletions

View File

@ -818,13 +818,44 @@ _efl_net_dialer_http_curl_safe_end(Eo *o, Efl_Net_Dialer_Http_Data *pd, CURL *ea
int refs;
refs = efl_ref_get(o);
efl_unref(o);
if (refs > 1)
if (refs > 2)
{
pd->in_curl_callback--;
efl_unref(o);
return;
}
if (pd->pending_close)
efl_future_cancel(pd->pending_close);
if (!pd->easy)
{
efl_unref(o);
return;
}
pd->easy = NULL;
efl_unref(o);
curl_easy_setopt(easy, CURLOPT_PRIVATE, NULL);
curl_easy_setopt(easy, CURLOPT_DEBUGFUNCTION, NULL);
curl_easy_setopt(easy, CURLOPT_DEBUGDATA, NULL);
curl_easy_setopt(easy, CURLOPT_XFERINFOFUNCTION, NULL);
curl_easy_setopt(easy, CURLOPT_XFERINFODATA, NULL);
curl_easy_setopt(easy, CURLOPT_HEADERFUNCTION, NULL);
curl_easy_setopt(easy, CURLOPT_HEADERDATA, NULL);
curl_easy_setopt(easy, CURLOPT_WRITEFUNCTION, NULL);
curl_easy_setopt(easy, CURLOPT_WRITEDATA, NULL);
curl_easy_setopt(easy, CURLOPT_READFUNCTION, NULL);
curl_easy_setopt(easy, CURLOPT_READDATA, NULL);
curl_easy_setopt(easy, CURLOPT_OPENSOCKETFUNCTION, NULL);
curl_easy_setopt(easy, CURLOPT_OPENSOCKETDATA, NULL);
curl_easy_setopt(easy, CURLOPT_NOPROGRESS, 1L);
curl_easy_setopt(easy, CURLOPT_VERBOSE, 0L);
/* object deleted from CURL callback, CURL* easy was
* dissociated and we must delete it ourselves.
*/
@ -1106,27 +1137,8 @@ _efl_net_dialer_http_efl_object_destructor(Eo *o, Efl_Net_Dialer_Http_Data *pd)
if (pd->in_curl_callback)
{
DBG("deleting HTTP dialer=%p from CURL callback.", o);
curl_easy_setopt(pd->easy, CURLOPT_PRIVATE, NULL);
curl_easy_setopt(pd->easy, CURLOPT_DEBUGFUNCTION, NULL);
curl_easy_setopt(pd->easy, CURLOPT_DEBUGDATA, NULL);
curl_easy_setopt(pd->easy, CURLOPT_XFERINFOFUNCTION, NULL);
curl_easy_setopt(pd->easy, CURLOPT_XFERINFODATA, NULL);
curl_easy_setopt(pd->easy, CURLOPT_HEADERFUNCTION, NULL);
curl_easy_setopt(pd->easy, CURLOPT_HEADERDATA, NULL);
curl_easy_setopt(pd->easy, CURLOPT_WRITEFUNCTION, NULL);
curl_easy_setopt(pd->easy, CURLOPT_WRITEDATA, NULL);
curl_easy_setopt(pd->easy, CURLOPT_READFUNCTION, NULL);
curl_easy_setopt(pd->easy, CURLOPT_READDATA, NULL);
curl_easy_setopt(pd->easy, CURLOPT_OPENSOCKETFUNCTION, NULL);
curl_easy_setopt(pd->easy, CURLOPT_OPENSOCKETDATA, NULL);
curl_easy_setopt(pd->easy, CURLOPT_NOPROGRESS, 1L);
curl_easy_setopt(pd->easy, CURLOPT_VERBOSE, 0L);
pd->easy = NULL;
EINA_SAFETY_ON_TRUE_RETURN(pd->easy != NULL);
EINA_SAFETY_ON_TRUE_RETURN(pd->pending_close != NULL);
}
else if (pd->pending_close)
{
@ -1694,7 +1706,7 @@ _efl_net_dialer_http_efl_io_closer_close(Eo *o, Efl_Net_Dialer_Http_Data *pd)
if (pd->in_curl_callback)
{
if (!pd->pending_close)
if ((!pd->pending_close) && (pd->easy))
{
efl_future_use(&pd->pending_close, efl_loop_job(efl_loop_get(o), o));
efl_future_then(pd->pending_close, _efl_net_dialer_http_pending_close, NULL, NULL, o);
@ -1734,6 +1746,7 @@ _efl_net_dialer_http_pending_close(void *data, const Efl_Event *ev EINA_UNUSED)
Eo *o = data;
Efl_Net_Dialer_Http_Data *pd = efl_data_scope_get(o, MY_CLASS);
pd->pending_close = NULL; /* XXX TODO this should be NULL-ified by efl_promise before calling this function */
_efl_net_dialer_http_efl_io_closer_close(o, pd);
}