diff --git a/lib/ftp.c b/lib/ftp.c index 00d60eac6..49e157138 100644 --- a/lib/ftp.c +++ b/lib/ftp.c @@ -1366,18 +1366,16 @@ static CURLcode ftp_state_ul_setup(struct connectdata *conn, else { curl_off_t passed=0; do { - curl_off_t readthisamountnow = (data->state.resume_from - passed); - curl_off_t actuallyread; + size_t readthisamountnow = + (data->state.resume_from - passed > CURL_OFF_T_C(BUFSIZE)) ? + BUFSIZE : curlx_sotouz(data->state.resume_from - passed); - if(readthisamountnow > BUFSIZE) - readthisamountnow = BUFSIZE; - - actuallyread = (curl_off_t) - conn->fread_func(data->state.buffer, 1, (size_t)readthisamountnow, + size_t actuallyread = + conn->fread_func(data->state.buffer, 1, readthisamountnow, conn->fread_in); passed += actuallyread; - if((actuallyread <= 0) || (actuallyread > readthisamountnow)) { + if((actuallyread == 0) || (actuallyread > readthisamountnow)) { /* this checks for greater-than only to make sure that the CURL_READFUNC_ABORT return code still aborts */ failf(data, "Failed to read data"); diff --git a/lib/http.c b/lib/http.c index ed0730c0a..e35437f1e 100644 --- a/lib/http.c +++ b/lib/http.c @@ -98,6 +98,7 @@ #include "rawstr.h" #include "content_encoding.h" #include "rtsp.h" +#include "warnless.h" #define _MPRINTF_REPLACE /* use our functions only */ #include @@ -2424,27 +2425,25 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) /* when seekerr == CURL_SEEKFUNC_CANTSEEK (can't seek to offset) */ else { curl_off_t passed=0; - do { - size_t readthisamountnow = (size_t)(data->state.resume_from - - passed); - size_t actuallyread; + size_t readthisamountnow = + (data->state.resume_from - passed > CURL_OFF_T_C(BUFSIZE)) ? + BUFSIZE : curlx_sotouz(data->state.resume_from - passed); - if(readthisamountnow > BUFSIZE) - readthisamountnow = BUFSIZE; - - actuallyread = data->set.fread_func(data->state.buffer, 1, - (size_t)readthisamountnow, - data->set.in); + size_t actuallyread = + data->set.fread_func(data->state.buffer, 1, readthisamountnow, + data->set.in); passed += actuallyread; - if(actuallyread != readthisamountnow) { + if((actuallyread == 0) || (actuallyread > readthisamountnow)) { + /* this checks for greater-than only to make sure that the + CURL_READFUNC_ABORT return code still aborts */ failf(data, "Could only read %" FORMAT_OFF_T " bytes from the input", passed); return CURLE_READ_ERROR; } - } while(passed != data->state.resume_from); /* loop until done */ + } while(passed < data->state.resume_from); } } diff --git a/lib/ssh.c b/lib/ssh.c index 52cf5ad98..d432b4ec4 100644 --- a/lib/ssh.c +++ b/lib/ssh.c @@ -101,6 +101,7 @@ #include "strtoofft.h" #include "multiif.h" #include "select.h" +#include "warnless.h" #define _MPRINTF_REPLACE /* use our functions only */ #include @@ -1541,21 +1542,17 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block) /* seekerr == CURL_SEEKFUNC_CANTSEEK (can't seek to offset) */ else { curl_off_t passed=0; - curl_off_t readthisamountnow; - curl_off_t actuallyread; do { - readthisamountnow = (data->state.resume_from - passed); + size_t readthisamountnow = + (data->state.resume_from - passed > CURL_OFF_T_C(BUFSIZE)) ? + BUFSIZE : curlx_sotouz(data->state.resume_from - passed); - if(readthisamountnow > BUFSIZE) - readthisamountnow = BUFSIZE; - - actuallyread = - (curl_off_t) conn->fread_func(data->state.buffer, 1, - (size_t)readthisamountnow, - conn->fread_in); + size_t actuallyread = + conn->fread_func(data->state.buffer, 1, readthisamountnow, + conn->fread_in); passed += actuallyread; - if((actuallyread <= 0) || (actuallyread > readthisamountnow)) { + if((actuallyread == 0) || (actuallyread > readthisamountnow)) { /* this checks for greater-than only to make sure that the CURL_READFUNC_ABORT return code still aborts */ failf(data, "Failed to read data"); diff --git a/lib/warnless.c b/lib/warnless.c index 3bd23df03..bc29d28df 100644 --- a/lib/warnless.c +++ b/lib/warnless.c @@ -141,7 +141,7 @@ unsigned char curlx_ultouc(unsigned long ulnum) } /* -** size_t to signed int +** unsigned size_t to signed int */ int curlx_uztosi(size_t uznum) @@ -169,6 +169,7 @@ int curlx_sltosi(long slnum) # pragma warning(disable:810) /* conversion may lose significant bits */ #endif + DEBUGASSERT(slnum >= 0); return (int)(slnum & (long) CURL_MASK_SINT); #ifdef __INTEL_COMPILER @@ -187,6 +188,7 @@ unsigned int curlx_sltoui(long slnum) # pragma warning(disable:810) /* conversion may lose significant bits */ #endif + DEBUGASSERT(slnum >= 0); return (unsigned int)(slnum & (long) CURL_MASK_UINT); #ifdef __INTEL_COMPILER @@ -205,6 +207,7 @@ unsigned short curlx_sltous(long slnum) # pragma warning(disable:810) /* conversion may lose significant bits */ #endif + DEBUGASSERT(slnum >= 0); return (unsigned short)(slnum & (long) CURL_MASK_USHORT); #ifdef __INTEL_COMPILER @@ -229,3 +232,22 @@ ssize_t curlx_uztosz(size_t uznum) # pragma warning(pop) #endif } + +/* +** signed curl_off_t to unsigned size_t +*/ + +size_t curlx_sotouz(curl_off_t sonum) +{ +#ifdef __INTEL_COMPILER +# pragma warning(push) +# pragma warning(disable:810) /* conversion may lose significant bits */ +#endif + + DEBUGASSERT(sonum >= 0); + return (size_t)(sonum & (curl_off_t) CURL_MASK_USIZE_T); + +#ifdef __INTEL_COMPILER +# pragma warning(pop) +#endif +} diff --git a/lib/warnless.h b/lib/warnless.h index 7181a6e38..7b9bd3c7f 100644 --- a/lib/warnless.h +++ b/lib/warnless.h @@ -36,4 +36,6 @@ unsigned short curlx_sltous(long slnum); ssize_t curlx_uztosz(size_t uznum); +size_t curlx_sotouz(curl_off_t sonum); + #endif /* HEADER_CURL_WARNLESS_H */