Commit 59b05ac3 authored by Dan Fandrich's avatar Dan Fandrich
Browse files

Fixed an OOM problem with file: URLs

Moved Curl_file_connect into the protocol handler struct.
parent 9b15f1be
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -6,6 +6,11 @@

                                  Changelog

Dan F (30 October 2007)
- Fixed an OOM problem with file: URLs

- Moved Curl_file_connect into the protocol handler struct

Dan F (29 October 2007)
- Added test case 546 to check that subsequent FTP transfers work after a
  failed one using the multi interface
+4 −5
Original line number Diff line number Diff line
@@ -97,6 +97,7 @@
static CURLcode Curl_file(struct connectdata *, bool *done);
static CURLcode Curl_file_done(struct connectdata *conn,
                               CURLcode status, bool premature);
static CURLcode Curl_file_connect(struct connectdata *conn, bool *done);

/*
 * FILE scheme handler.
@@ -108,7 +109,7 @@ const struct Curl_handler Curl_handler_file = {
  Curl_file,                            /* do_it */
  Curl_file_done,                       /* done */
  ZERO_NULL,                            /* do_more */
  ZERO_NULL,                            /* connect_it */
  Curl_file_connect,                    /* connect_it */
  ZERO_NULL,                            /* connecting */
  ZERO_NULL,                            /* doing */
  ZERO_NULL,                            /* proto_getsock */
@@ -123,7 +124,7 @@ const struct Curl_handler Curl_handler_file = {
 * do protocol-specific actions at connect-time.  We emulate a
 * connect-then-transfer protocol and "connect" to the file here
 */
CURLcode Curl_file_connect(struct connectdata *conn)
static CURLcode Curl_file_connect(struct connectdata *conn, bool *done)
{
  struct SessionHandle *data = conn->data;
  char *real_path = curl_easy_unescape(data, data->reqdata.path, 0, NULL);
@@ -203,6 +204,7 @@ CURLcode Curl_file_connect(struct connectdata *conn)
    Curl_file_done(conn, CURLE_FILE_COULDNT_READ_FILE, FALSE);
    return CURLE_FILE_COULDNT_READ_FILE;
  }
  *done = TRUE;

  return CURLE_OK;
}
@@ -218,9 +220,6 @@ static CURLcode Curl_file_done(struct connectdata *conn,
  if(file->fd != -1)
    close(file->fd);

  free(file);
  conn->data->reqdata.proto.file= NULL; /* clear it! */

  return CURLE_OK;
}

+0 −2
Original line number Diff line number Diff line
@@ -25,7 +25,5 @@
 ***************************************************************************/
#ifndef CURL_DISABLE_FILE
extern const struct Curl_handler Curl_handler_file;

CURLcode Curl_file_connect(struct connectdata *);
#endif
#endif
+6 −4
Original line number Diff line number Diff line
@@ -3638,10 +3638,12 @@ static CURLcode CreateConnection(struct SessionHandle *data,
   * file: is a special case in that it doesn't need a network connection
   ***********************************************************************/
#ifndef CURL_DISABLE_FILE
  if (strequal(conn->protostr, "FILE")) {
  if(conn->protocol & PROT_FILE) {
    bool done;
    /* this is supposed to be the connect function so we better at least check
       that the file is present here! */
    result = Curl_file_connect(conn);
    DEBUGASSERT(conn->handler->connect_it);
    result = conn->handler->connect_it(conn, &done);

    /* Setup a "faked" transfer that'll do nothing */
    if(CURLE_OK == result) {
@@ -3652,8 +3654,8 @@ static CURLcode CreateConnection(struct SessionHandle *data,

      result = setup_range(data);
      if(result) {
        if(conn->handler->done)
          result = conn->handler->done(conn, result, FALSE);
        DEBUGASSERT(conn->handler->done);
        conn->handler->done(conn, result, FALSE);
        return result;
      }