Commit 8997d258 authored by Daniel Stenberg's avatar Daniel Stenberg
Browse files

Curl_ftp_disconnect() no longer relies on anything in the reqdata struct. That

was even mentioned to be bad in a comment! Should make test 2000 and 2001 work
fine.

Also, freedirs() now take a ftp_conn struct pointer which saves some extra
unnecessary variable assignments.
parent a3f958aa
Loading
Loading
Loading
Loading
+28 −33
Original line number Diff line number Diff line
@@ -259,10 +259,8 @@ const struct Curl_handler Curl_handler_ftps_proxy = {
 */
#define CURL_FTP_HTTPSTYLE_HEAD 1

static void freedirs(struct connectdata *conn)
static void freedirs(struct ftp_conn *ftpc)
{
  struct ftp_conn *ftpc = &conn->proto.ftpc;

  int i;
  if(ftpc->dirs) {
    for (i=0; i < ftpc->dirdepth; i++){
@@ -3209,7 +3207,7 @@ static CURLcode Curl_ftp_done(struct connectdata *conn, CURLcode status,
    }
  }
  /* free the dir tree and file parts */
  freedirs(conn);
  freedirs(ftpc);

#if defined(HAVE_KRB4) || defined(HAVE_GSSAPI)
  Curl_sec_fflush_fd(conn, conn->sock[SECONDARYSOCKET]);
@@ -3806,9 +3804,6 @@ static CURLcode Curl_ftp_disconnect(struct connectdata *conn)
  */

  /* The FTP session may or may not have been allocated/setup at this point! */
  /* FIXME: checking for conn->data->reqdata.proto.ftp is not correct here,
   * the reqdata structure could be used by another connection already */
  if(conn->data->reqdata.proto.ftp) {
  (void)ftp_quit(conn); /* ignore errors on the QUIT */

  if(ftpc->entrypath) {
@@ -3823,12 +3818,12 @@ static CURLcode Curl_ftp_disconnect(struct connectdata *conn)
    free(ftpc->cache);
    ftpc->cache = NULL;
  }
    freedirs(conn);
  freedirs(ftpc);
  if(ftpc->prevpath) {
    free(ftpc->prevpath);
    ftpc->prevpath = NULL;
  }
  }

  return CURLE_OK;
}

@@ -3900,7 +3895,7 @@ CURLcode ftp_parse_url_path(struct connectdata *conn)
                                         slash_pos?(int)(slash_pos-cur_pos):1,
                                         NULL);
      if(!ftpc->dirs[0]) {
        freedirs(conn);
        freedirs(ftpc);
        return CURLE_OUT_OF_MEMORY;
      }
      ftpc->dirdepth = 1; /* we consider it to be a single dir */
@@ -3941,12 +3936,12 @@ CURLcode ftp_parse_url_path(struct connectdata *conn)
            curl_easy_unescape(conn->data, cur_pos - absolute_dir, len, NULL);
          if (!ftpc->dirs[ftpc->dirdepth]) { /* run out of memory ... */
            failf(data, "no memory");
            freedirs(conn);
            freedirs(ftpc);
            return CURLE_OUT_OF_MEMORY;
          }
          if (isBadFtpString(ftpc->dirs[ftpc->dirdepth])) {
            free(ftpc->dirs[ftpc->dirdepth]);
            freedirs(conn);
            freedirs(ftpc);
            return CURLE_URL_MALFORMAT;
          }
        }
@@ -3962,7 +3957,7 @@ CURLcode ftp_parse_url_path(struct connectdata *conn)
          ftpc->diralloc *= 2; /* double the size each time */
          bigger = realloc(ftpc->dirs, ftpc->diralloc * sizeof(ftpc->dirs[0]));
          if(!bigger) {
            freedirs(conn);
            freedirs(ftpc);
            return CURLE_OUT_OF_MEMORY;
          }
          ftpc->dirs = (char **)bigger;
@@ -3975,12 +3970,12 @@ CURLcode ftp_parse_url_path(struct connectdata *conn)
  if(ftpc->file && *ftpc->file) {
    ftpc->file = curl_easy_unescape(conn->data, ftpc->file, 0, NULL);
    if(NULL == ftpc->file) {
      freedirs(conn);
      freedirs(ftpc);
      failf(data, "no memory");
      return CURLE_OUT_OF_MEMORY;
    }
    if (isBadFtpString(ftpc->file)) {
      freedirs(conn);
      freedirs(ftpc);
      return CURLE_URL_MALFORMAT;
    }
  }
@@ -4001,7 +3996,7 @@ CURLcode ftp_parse_url_path(struct connectdata *conn)
       strings */
    char *path = curl_easy_unescape(conn->data, data->reqdata.path, 0, NULL);
    if(!path) {
      freedirs(conn);
      freedirs(ftpc);
      return CURLE_OUT_OF_MEMORY;
    }

@@ -4106,7 +4101,7 @@ CURLcode ftp_regular_transfer(struct connectdata *conn,
      return result;
  }
  else
    freedirs(conn);
    freedirs(ftpc);

  return result;
}