Fixed an OOM problem with file: URLs

Moved Curl_file_connect into the protocol handler struct.
This commit is contained in:
Dan Fandrich 2007-10-30 23:00:40 +00:00
parent 9b15f1be26
commit 59b05ac383
4 changed files with 15 additions and 11 deletions

View File

@ -6,6 +6,11 @@
Changelog 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) Dan F (29 October 2007)
- Added test case 546 to check that subsequent FTP transfers work after a - Added test case 546 to check that subsequent FTP transfers work after a
failed one using the multi interface failed one using the multi interface

View File

@ -97,6 +97,7 @@
static CURLcode Curl_file(struct connectdata *, bool *done); static CURLcode Curl_file(struct connectdata *, bool *done);
static CURLcode Curl_file_done(struct connectdata *conn, static CURLcode Curl_file_done(struct connectdata *conn,
CURLcode status, bool premature); CURLcode status, bool premature);
static CURLcode Curl_file_connect(struct connectdata *conn, bool *done);
/* /*
* FILE scheme handler. * FILE scheme handler.
@ -108,7 +109,7 @@ const struct Curl_handler Curl_handler_file = {
Curl_file, /* do_it */ Curl_file, /* do_it */
Curl_file_done, /* done */ Curl_file_done, /* done */
ZERO_NULL, /* do_more */ ZERO_NULL, /* do_more */
ZERO_NULL, /* connect_it */ Curl_file_connect, /* connect_it */
ZERO_NULL, /* connecting */ ZERO_NULL, /* connecting */
ZERO_NULL, /* doing */ ZERO_NULL, /* doing */
ZERO_NULL, /* proto_getsock */ 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 * do protocol-specific actions at connect-time. We emulate a
* connect-then-transfer protocol and "connect" to the file here * 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; struct SessionHandle *data = conn->data;
char *real_path = curl_easy_unescape(data, data->reqdata.path, 0, NULL); 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); Curl_file_done(conn, CURLE_FILE_COULDNT_READ_FILE, FALSE);
return CURLE_FILE_COULDNT_READ_FILE; return CURLE_FILE_COULDNT_READ_FILE;
} }
*done = TRUE;
return CURLE_OK; return CURLE_OK;
} }
@ -218,9 +220,6 @@ static CURLcode Curl_file_done(struct connectdata *conn,
if(file->fd != -1) if(file->fd != -1)
close(file->fd); close(file->fd);
free(file);
conn->data->reqdata.proto.file= NULL; /* clear it! */
return CURLE_OK; return CURLE_OK;
} }

View File

@ -25,7 +25,5 @@
***************************************************************************/ ***************************************************************************/
#ifndef CURL_DISABLE_FILE #ifndef CURL_DISABLE_FILE
extern const struct Curl_handler Curl_handler_file; extern const struct Curl_handler Curl_handler_file;
CURLcode Curl_file_connect(struct connectdata *);
#endif #endif
#endif #endif

View File

@ -3638,10 +3638,12 @@ static CURLcode CreateConnection(struct SessionHandle *data,
* file: is a special case in that it doesn't need a network connection * file: is a special case in that it doesn't need a network connection
***********************************************************************/ ***********************************************************************/
#ifndef CURL_DISABLE_FILE #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 /* this is supposed to be the connect function so we better at least check
that the file is present here! */ 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 */ /* Setup a "faked" transfer that'll do nothing */
if(CURLE_OK == result) { if(CURLE_OK == result) {
@ -3652,8 +3654,8 @@ static CURLcode CreateConnection(struct SessionHandle *data,
result = setup_range(data); result = setup_range(data);
if(result) { if(result) {
if(conn->handler->done) DEBUGASSERT(conn->handler->done);
result = conn->handler->done(conn, result, FALSE); conn->handler->done(conn, result, FALSE);
return result; return result;
} }