]> granicus.if.org Git - curl/commitdiff
ftp wildcard: segfault due to init only in multi_perform
authorDaniel Stenberg <daniel@haxx.se>
Sat, 14 May 2016 22:37:36 +0000 (00:37 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Sat, 14 May 2016 22:37:36 +0000 (00:37 +0200)
The proper FTP wildcard init is now more properly done in Curl_pretransfer()
and the corresponding cleanup in Curl_close().

The previous place of init/cleanup code made the internal pointer to be NULL
when this feature was used with the multi_socket() API, as it was made within
the curl_multi_perform() function.

Reported-by: Jonathan Cardoso Machado
Fixes #800

lib/multi.c
lib/transfer.c
lib/url.c

index ffc422c40af1a2d8f21d2415a293ab84f8999207..7e2725bab6abeef4d258eb088a9cf2363993b370 100644 (file)
@@ -2116,27 +2116,12 @@ CURLMcode curl_multi_perform(CURLM *multi_handle, int *running_handles)
   data=multi->easyp;
   while(data) {
     CURLMcode result;
-    struct WildcardData *wc = &data->wildcard;
     SIGPIPE_VARIABLE(pipe_st);
 
-    if(data->set.wildcardmatch) {
-      if(!wc->filelist) {
-        CURLcode ret = Curl_wildcard_init(wc); /* init wildcard structures */
-        if(ret)
-          return CURLM_OUT_OF_MEMORY;
-      }
-    }
-
     sigpipe_ignore(data, &pipe_st);
     result = multi_runsingle(multi, now, data);
     sigpipe_restore(&pipe_st);
 
-    if(data->set.wildcardmatch) {
-      /* destruct wildcard structures if it is needed */
-      if(wc->state == CURLWC_DONE || result)
-        Curl_wildcard_dtor(wc);
-    }
-
     if(result)
       returncode = result;
 
index 5b22003dcbb73aaabb90c016b9e59a253d286f2d..72f4bd9ef596d75e7bd3ab119aee9a0d75970c53 100644 (file)
@@ -1385,6 +1385,16 @@ CURLcode Curl_pretransfer(struct SessionHandle *data)
        consider to be fine */
     data->state.authhost.picked &= data->state.authhost.want;
     data->state.authproxy.picked &= data->state.authproxy.want;
+
+    if(data->set.wildcardmatch) {
+      struct WildcardData *wc = &data->wildcard;
+      if(!wc->filelist) {
+        result = Curl_wildcard_init(wc); /* init wildcard structures */
+        if(result)
+          return CURLM_OUT_OF_MEMORY;
+      }
+    }
+
   }
 
   return result;
index f897f5344959224b292d2ba84b43c118f160ceb2..2a3026650760e468f5d4dad86260161fdf5bc2e9 100644 (file)
--- a/lib/url.c
+++ b/lib/url.c
@@ -484,6 +484,12 @@ CURLcode Curl_close(struct SessionHandle *data)
     Curl_share_unlock(data, CURL_LOCK_DATA_SHARE);
   }
 
+  if(data->set.wildcardmatch) {
+    /* destruct wildcard structures if it is needed */
+    struct WildcardData *wc = &data->wildcard;
+    Curl_wildcard_dtor(wc);
+  }
+
   Curl_freeset(data);
   free(data);
   return CURLE_OK;