mirror of
https://github.com/curl/curl.git
synced 2025-01-30 14:22:33 +08:00
file+ftp: use stack buffers instead of data->state.buffer
Closes #12789
This commit is contained in:
parent
9a90c9dd64
commit
a6c9a33bf8
34
lib/file.c
34
lib/file.c
@ -290,16 +290,15 @@ static CURLcode file_upload(struct Curl_easy *data)
|
|||||||
int fd;
|
int fd;
|
||||||
int mode;
|
int mode;
|
||||||
CURLcode result = CURLE_OK;
|
CURLcode result = CURLE_OK;
|
||||||
char *buf = data->state.buffer;
|
char buffer[8*1024], *uphere_save;
|
||||||
curl_off_t bytecount = 0;
|
curl_off_t bytecount = 0;
|
||||||
struct_stat file_stat;
|
struct_stat file_stat;
|
||||||
const char *buf2;
|
const char *sendbuf;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Since FILE: doesn't do the full init, we need to provide some extra
|
* Since FILE: doesn't do the full init, we need to provide some extra
|
||||||
* assignments here.
|
* assignments here.
|
||||||
*/
|
*/
|
||||||
data->req.upload_fromhere = buf;
|
|
||||||
|
|
||||||
if(!dir)
|
if(!dir)
|
||||||
return CURLE_FILE_COULDNT_READ_FILE; /* fix: better error code */
|
return CURLE_FILE_COULDNT_READ_FILE; /* fix: better error code */
|
||||||
@ -338,11 +337,15 @@ static CURLcode file_upload(struct Curl_easy *data)
|
|||||||
data->state.resume_from = (curl_off_t)file_stat.st_size;
|
data->state.resume_from = (curl_off_t)file_stat.st_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Yikes! Curl_fillreadbuffer uses data->req.upload_fromhere to READ
|
||||||
|
* client data to! Please, someone fix... */
|
||||||
|
uphere_save = data->req.upload_fromhere;
|
||||||
while(!result) {
|
while(!result) {
|
||||||
size_t nread;
|
size_t nread;
|
||||||
ssize_t nwrite;
|
ssize_t nwrite;
|
||||||
size_t readcount;
|
size_t readcount;
|
||||||
result = Curl_fillreadbuffer(data, data->set.buffer_size, &readcount);
|
data->req.upload_fromhere = buffer;
|
||||||
|
result = Curl_fillreadbuffer(data, sizeof(buffer), &readcount);
|
||||||
if(result)
|
if(result)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -356,19 +359,19 @@ static CURLcode file_upload(struct Curl_easy *data)
|
|||||||
if((curl_off_t)nread <= data->state.resume_from) {
|
if((curl_off_t)nread <= data->state.resume_from) {
|
||||||
data->state.resume_from -= nread;
|
data->state.resume_from -= nread;
|
||||||
nread = 0;
|
nread = 0;
|
||||||
buf2 = buf;
|
sendbuf = buffer;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
buf2 = buf + data->state.resume_from;
|
sendbuf = buffer + data->state.resume_from;
|
||||||
nread -= (size_t)data->state.resume_from;
|
nread -= (size_t)data->state.resume_from;
|
||||||
data->state.resume_from = 0;
|
data->state.resume_from = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
buf2 = buf;
|
sendbuf = buffer;
|
||||||
|
|
||||||
/* write the data to the target */
|
/* write the data to the target */
|
||||||
nwrite = write(fd, buf2, nread);
|
nwrite = write(fd, sendbuf, nread);
|
||||||
if((size_t)nwrite != nread) {
|
if((size_t)nwrite != nread) {
|
||||||
result = CURLE_SEND_ERROR;
|
result = CURLE_SEND_ERROR;
|
||||||
break;
|
break;
|
||||||
@ -387,6 +390,7 @@ static CURLcode file_upload(struct Curl_easy *data)
|
|||||||
result = CURLE_ABORTED_BY_CALLBACK;
|
result = CURLE_ABORTED_BY_CALLBACK;
|
||||||
|
|
||||||
close(fd);
|
close(fd);
|
||||||
|
data->req.upload_fromhere = uphere_save;
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -413,7 +417,6 @@ static CURLcode file_do(struct Curl_easy *data, bool *done)
|
|||||||
curl_off_t expected_size = -1;
|
curl_off_t expected_size = -1;
|
||||||
bool size_known;
|
bool size_known;
|
||||||
bool fstated = FALSE;
|
bool fstated = FALSE;
|
||||||
char *buf = data->state.buffer;
|
|
||||||
int fd;
|
int fd;
|
||||||
struct FILEPROTO *file;
|
struct FILEPROTO *file;
|
||||||
|
|
||||||
@ -541,21 +544,22 @@ static CURLcode file_do(struct Curl_easy *data, bool *done)
|
|||||||
Curl_pgrsTime(data, TIMER_STARTTRANSFER);
|
Curl_pgrsTime(data, TIMER_STARTTRANSFER);
|
||||||
|
|
||||||
while(!result) {
|
while(!result) {
|
||||||
|
char tmpbuf[8*1024];
|
||||||
ssize_t nread;
|
ssize_t nread;
|
||||||
/* Don't fill a whole buffer if we want less than all data */
|
/* Don't fill a whole buffer if we want less than all data */
|
||||||
size_t bytestoread;
|
size_t bytestoread;
|
||||||
|
|
||||||
if(size_known) {
|
if(size_known) {
|
||||||
bytestoread = (expected_size < data->set.buffer_size) ?
|
bytestoread = (expected_size < (curl_off_t)(sizeof(tmpbuf)-1)) ?
|
||||||
curlx_sotouz(expected_size) : (size_t)data->set.buffer_size;
|
curlx_sotouz(expected_size) : (sizeof(tmpbuf)-1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
bytestoread = data->set.buffer_size-1;
|
bytestoread = sizeof(tmpbuf)-1;
|
||||||
|
|
||||||
nread = read(fd, buf, bytestoread);
|
nread = read(fd, tmpbuf, bytestoread);
|
||||||
|
|
||||||
if(nread > 0)
|
if(nread > 0)
|
||||||
buf[nread] = 0;
|
tmpbuf[nread] = 0;
|
||||||
|
|
||||||
if(nread <= 0 || (size_known && (expected_size == 0)))
|
if(nread <= 0 || (size_known && (expected_size == 0)))
|
||||||
break;
|
break;
|
||||||
@ -563,7 +567,7 @@ static CURLcode file_do(struct Curl_easy *data, bool *done)
|
|||||||
if(size_known)
|
if(size_known)
|
||||||
expected_size -= nread;
|
expected_size -= nread;
|
||||||
|
|
||||||
result = Curl_client_write(data, CLIENTWRITE_BODY, buf, nread);
|
result = Curl_client_write(data, CLIENTWRITE_BODY, tmpbuf, nread);
|
||||||
if(result)
|
if(result)
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
|
@ -1587,13 +1587,14 @@ static CURLcode ftp_state_ul_setup(struct Curl_easy *data,
|
|||||||
}
|
}
|
||||||
/* seekerr == CURL_SEEKFUNC_CANTSEEK (can't seek to offset) */
|
/* seekerr == CURL_SEEKFUNC_CANTSEEK (can't seek to offset) */
|
||||||
do {
|
do {
|
||||||
|
char scratch[4*1024];
|
||||||
size_t readthisamountnow =
|
size_t readthisamountnow =
|
||||||
(data->state.resume_from - passed > data->set.buffer_size) ?
|
(data->state.resume_from - passed > (curl_off_t)sizeof(scratch)) ?
|
||||||
(size_t)data->set.buffer_size :
|
sizeof(scratch) :
|
||||||
curlx_sotouz(data->state.resume_from - passed);
|
curlx_sotouz(data->state.resume_from - passed);
|
||||||
|
|
||||||
size_t actuallyread =
|
size_t actuallyread =
|
||||||
data->state.fread_func(data->state.buffer, 1, readthisamountnow,
|
data->state.fread_func(scratch, 1, readthisamountnow,
|
||||||
data->state.in);
|
data->state.in);
|
||||||
|
|
||||||
passed += actuallyread;
|
passed += actuallyread;
|
||||||
|
Loading…
Reference in New Issue
Block a user