diff options
| author | Yang Tse <yangsita@gmail.com> | 2010-12-04 05:53:07 +0100 | 
|---|---|---|
| committer | Yang Tse <yangsita@gmail.com> | 2010-12-04 05:53:07 +0100 | 
| commit | c1901f7ed0dc43a92e611ff4cfc00ad97425318f (patch) | |
| tree | 394c83122f62518080a923494fe5411afccded97 | |
| parent | 9c4ff4874e0df1c16d10674ec418cd23c263ec3f (diff) | |
fix compiler warning: conversion may lose significant bits
| -rw-r--r-- | lib/ftp.c | 14 | ||||
| -rw-r--r-- | lib/http.c | 23 | ||||
| -rw-r--r-- | lib/ssh.c | 19 | ||||
| -rw-r--r-- | lib/warnless.c | 24 | ||||
| -rw-r--r-- | lib/warnless.h | 2 | 
5 files changed, 50 insertions, 32 deletions
@@ -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 <curl/mprintf.h> @@ -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; - -            if(readthisamountnow > BUFSIZE) -              readthisamountnow = BUFSIZE; +            size_t readthisamountnow = +              (data->state.resume_from - passed > CURL_OFF_T_C(BUFSIZE)) ? +              BUFSIZE : curlx_sotouz(data->state.resume_from - passed); -            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);          }        } @@ -101,6 +101,7 @@  #include "strtoofft.h"  #include "multiif.h"  #include "select.h" +#include "warnless.h"  #define _MPRINTF_REPLACE /* use our functions only */  #include <curl/mprintf.h> @@ -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 */  | 
