diff --git a/lib/file.c b/lib/file.c index 4a064a065..8f47a19e6 100644 --- a/lib/file.c +++ b/lib/file.c @@ -218,7 +218,12 @@ static CURLcode file_upload(struct connectdata *conn) Curl_pgrsSetUploadSize(data, data->set.infilesize); while (res == CURLE_OK) { - nread = Curl_fillreadbuffer(conn, BUFSIZE); + int readcount; + res = Curl_fillreadbuffer(conn, BUFSIZE, &readcount); + if(res) + return res; + + nread = (size_t)readcount; if (nread <= 0) break; diff --git a/lib/transfer.c b/lib/transfer.c index 9ce78c552..1da2cc9c1 100644 --- a/lib/transfer.c +++ b/lib/transfer.c @@ -125,8 +125,9 @@ static struct timeval notimeout={0,0}; * This function will call the read callback to fill our buffer with data * to upload. */ -int Curl_fillreadbuffer(struct connectdata *conn, int bytes) +CURLcode Curl_fillreadbuffer(struct connectdata *conn, int bytes, int *nreadp) { + struct SessionHandle *data = conn->data; int buffersize = bytes; int nread; @@ -139,6 +140,11 @@ int Curl_fillreadbuffer(struct connectdata *conn, int bytes) nread = conn->fread(conn->upload_fromhere, 1, buffersize, conn->fread_in); + if(nread == CURL_READFUNC_ABORT) { + failf(data, "operation aborted by callback\n"); + return CURLE_ABORTED_BY_CALLBACK; + } + if(!conn->bits.forbidchunk && conn->bits.upload_chunky) { /* if chunked Transfer-Encoding */ char hexbuffer[11]; @@ -161,7 +167,10 @@ int Curl_fillreadbuffer(struct connectdata *conn, int bytes) nread+=2; /* for the added CRLF */ } - return nread; + + *nreadp = nread; + + return CURLE_OK; } /* @@ -1131,7 +1140,9 @@ CURLcode Curl_readwrite(struct connectdata *conn, break; } - nread = Curl_fillreadbuffer(conn, BUFSIZE); + result = Curl_fillreadbuffer(conn, BUFSIZE, &nread); + if(result) + return result; } else nread = 0; /* we're done uploading/reading */ diff --git a/lib/transfer.h b/lib/transfer.h index ddcca06c1..4ebf07532 100644 --- a/lib/transfer.h +++ b/lib/transfer.h @@ -35,7 +35,7 @@ void Curl_single_fdset(struct connectdata *conn, int *max_fd); CURLcode Curl_readwrite_init(struct connectdata *conn); -int Curl_fillreadbuffer(struct connectdata *conn, int bytes); +CURLcode Curl_fillreadbuffer(struct connectdata *conn, int bytes, int *nreadp); /* This sets up a forthcoming transfer */ CURLcode