aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYang Tse <yangsita@gmail.com>2010-12-04 05:53:07 +0100
committerYang Tse <yangsita@gmail.com>2010-12-04 05:53:07 +0100
commitc1901f7ed0dc43a92e611ff4cfc00ad97425318f (patch)
tree394c83122f62518080a923494fe5411afccded97
parent9c4ff4874e0df1c16d10674ec418cd23c263ec3f (diff)
fix compiler warning: conversion may lose significant bits
-rw-r--r--lib/ftp.c14
-rw-r--r--lib/http.c23
-rw-r--r--lib/ssh.c19
-rw-r--r--lib/warnless.c24
-rw-r--r--lib/warnless.h2
5 files changed, 50 insertions, 32 deletions
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 <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);
}
}
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 <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 */