Fixed an OOM problem with file: URLs
Moved Curl_file_connect into the protocol handler struct.
This commit is contained in:
parent
9b15f1be26
commit
59b05ac383
5
CHANGES
5
CHANGES
@ -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
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
10
lib/url.c
10
lib/url.c
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user