Commit cba96213 authored by Daniel Stenberg's avatar Daniel Stenberg
Browse files

ftp wildcard: segfault due to init only in multi_perform

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
parent e1372418
Loading
Loading
Loading
Loading
+0 −15
Original line number Diff line number Diff line
@@ -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;

+10 −0
Original line number Diff line number Diff line
@@ -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;
+6 −0
Original line number Diff line number Diff line
@@ -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;