diff options
-rw-r--r-- | ares/Makefile.inc | 2 | ||||
-rw-r--r-- | ares/ares__read_line.c | 7 | ||||
-rw-r--r-- | ares/ares_nowarn.c | 53 | ||||
-rw-r--r-- | ares/ares_nowarn.h | 23 | ||||
-rw-r--r-- | lib/curlx.h | 1 | ||||
-rw-r--r-- | lib/warnless.c | 72 | ||||
-rw-r--r-- | lib/warnless.h | 2 | ||||
-rw-r--r-- | tests/server/getpart.c | 10 |
8 files changed, 164 insertions, 6 deletions
diff --git a/ares/Makefile.inc b/ares/Makefile.inc index 322785899..8958b6059 100644 --- a/ares/Makefile.inc +++ b/ares/Makefile.inc @@ -19,6 +19,7 @@ CSOURCES = ares__close_sockets.c \ ares_library_init.c \ ares_llist.c \ ares_mkquery.c \ + ares_nowarn.c \ ares_parse_a_reply.c \ ares_parse_aaaa_reply.c \ ares_parse_ns_reply.c \ @@ -47,6 +48,7 @@ HHEADERS = ares.h \ ares_ipv6.h \ ares_library_init.h \ ares_llist.h \ + ares_nowarn.h \ ares_private.h \ ares_rules.h \ ares_strcasecmp.h \ diff --git a/ares/ares__read_line.c b/ares/ares__read_line.c index 29f8e5dc0..2e94945dc 100644 --- a/ares/ares__read_line.c +++ b/ares/ares__read_line.c @@ -20,6 +20,7 @@ #include <stdlib.h> #include <string.h> #include "ares.h" +#include "ares_nowarn.h" #include "ares_private.h" /* This is an internal function. Its contract is to read a line from @@ -46,7 +47,9 @@ int ares__read_line(FILE *fp, char **buf, size_t *bufsize) for (;;) { - if (!fgets(*buf + offset, (int)(*bufsize - offset), fp)) + int bytestoread = aresx_uztosi(*bufsize - offset); + + if (!fgets(*buf + offset, bytestoread, fp)) return (offset != 0) ? 0 : (ferror(fp)) ? ARES_EFILE : ARES_EOF; len = offset + strlen(*buf + offset); if ((*buf)[len - 1] == '\n') @@ -55,6 +58,8 @@ int ares__read_line(FILE *fp, char **buf, size_t *bufsize) break; } offset = len; + if(len < *bufsize - 1) + continue; /* Allocate more space. */ newbuf = realloc(*buf, *bufsize * 2); diff --git a/ares/ares_nowarn.c b/ares/ares_nowarn.c new file mode 100644 index 000000000..91d0a5f20 --- /dev/null +++ b/ares/ares_nowarn.c @@ -0,0 +1,53 @@ +/* $Id$ */ + +/* Copyright (C) 2010 by Daniel Stenberg + * + * Permission to use, copy, modify, and distribute this + * software and its documentation for any purpose and without + * fee is hereby granted, provided that the above copyright + * notice appear in all copies and that both that copyright + * notice and this permission notice appear in supporting + * documentation, and that the name of M.I.T. not be used in + * advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. + * M.I.T. makes no representations about the suitability of + * this software for any purpose. It is provided "as is" + * without express or implied warranty. + */ + + +#include "ares_setup.h" + +#include "ares_nowarn.h" + +#if (SIZEOF_INT == 2) +# define CARES_MASK_SINT 0x7FFF +# define CARES_MASK_UINT 0xFFFF +#elif (SIZEOF_INT == 4) +# define CARES_MASK_SINT 0x7FFFFFFF +# define CARES_MASK_UINT 0xFFFFFFFF +#elif (SIZEOF_INT == 8) +# define CARES_MASK_SINT 0x7FFFFFFFFFFFFFFF +# define CARES_MASK_UINT 0xFFFFFFFFFFFFFFFF +#elif (SIZEOF_INT == 16) +# define CARES_MASK_SINT 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +# define CARES_MASK_UINT 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +#endif + +/* +** size_t to signed int +*/ + +int aresx_uztosi(size_t uznum) +{ +#ifdef __INTEL_COMPILER +# pragma warning(push) +# pragma warning(disable:810) /* conversion may lose significant bits */ +#endif + + return (int)(uznum & (size_t) CARES_MASK_SINT); + +#ifdef __INTEL_COMPILER +# pragma warning(pop) +#endif +} diff --git a/ares/ares_nowarn.h b/ares/ares_nowarn.h new file mode 100644 index 000000000..0b7181bd4 --- /dev/null +++ b/ares/ares_nowarn.h @@ -0,0 +1,23 @@ +#ifndef HEADER_CARES_NOWARN_H +#define HEADER_CARES_NOWARN_H + +/* $Id$ */ + +/* Copyright (C) 2010 by Daniel Stenberg + * + * Permission to use, copy, modify, and distribute this + * software and its documentation for any purpose and without + * fee is hereby granted, provided that the above copyright + * notice appear in all copies and that both that copyright + * notice and this permission notice appear in supporting + * documentation, and that the name of M.I.T. not be used in + * advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. + * M.I.T. makes no representations about the suitability of + * this software for any purpose. It is provided "as is" + * without express or implied warranty. + */ + +int aresx_uztosi(size_t uznum); + +#endif /* HEADER_CARES_NOWARN_H */ diff --git a/lib/curlx.h b/lib/curlx.h index 1f84e6d0a..d5de599f5 100644 --- a/lib/curlx.h +++ b/lib/curlx.h @@ -61,6 +61,7 @@ curlx_ultous() curlx_ultouc() + curlx_uztosi() */ /* Now setup curlx_ * names for the functions that are to become curlx_ and diff --git a/lib/warnless.c b/lib/warnless.c index ffbcaa3f1..232ff8027 100644 --- a/lib/warnless.c +++ b/lib/warnless.c @@ -25,6 +25,52 @@ #include "warnless.h" +#define CURL_MASK_SCHAR 0x7F +#define CURL_MASK_UCHAR 0xFF + +#if (SIZEOF_SHORT == 2) +# define CURL_MASK_SSHORT 0x7FFF +# define CURL_MASK_USHORT 0xFFFF +#elif (SIZEOF_SHORT == 4) +# define CURL_MASK_SSHORT 0x7FFFFFFF +# define CURL_MASK_USHORT 0xFFFFFFFF +#elif (SIZEOF_SHORT == 8) +# define CURL_MASK_SSHORT 0x7FFFFFFFFFFFFFFF +# define CURL_MASK_USHORT 0xFFFFFFFFFFFFFFFF +#endif + +#if (SIZEOF_INT == 2) +# define CURL_MASK_SINT 0x7FFF +# define CURL_MASK_UINT 0xFFFF +#elif (SIZEOF_INT == 4) +# define CURL_MASK_SINT 0x7FFFFFFF +# define CURL_MASK_UINT 0xFFFFFFFF +#elif (SIZEOF_INT == 8) +# define CURL_MASK_SINT 0x7FFFFFFFFFFFFFFF +# define CURL_MASK_UINT 0xFFFFFFFFFFFFFFFF +#elif (SIZEOF_INT == 16) +# define CURL_MASK_SINT 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +# define CURL_MASK_UINT 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +#endif + +#if (SIZEOF_LONG == 2) +# define CURL_MASK_SLONG 0x7FFFL +# define CURL_MASK_ULONG 0xFFFFUL +#elif (SIZEOF_LONG == 4) +# define CURL_MASK_SLONG 0x7FFFFFFFL +# define CURL_MASK_ULONG 0xFFFFFFFFUL +#elif (SIZEOF_LONG == 8) +# define CURL_MASK_SLONG 0x7FFFFFFFFFFFFFFFL +# define CURL_MASK_ULONG 0xFFFFFFFFFFFFFFFFUL +#elif (SIZEOF_LONG == 16) +# define CURL_MASK_SLONG 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFL +# define CURL_MASK_ULONG 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFUL +#endif + +/* +** unsigned long to unsigned short +*/ + unsigned short curlx_ultous(unsigned long ulnum) { #ifdef __INTEL_COMPILER @@ -32,13 +78,17 @@ unsigned short curlx_ultous(unsigned long ulnum) # pragma warning(disable:810) /* conversion may lose significant bits */ #endif - return (unsigned short)(ulnum & 0xFFFFUL); + return (unsigned short)(ulnum & (unsigned long) CURL_MASK_USHORT); #ifdef __INTEL_COMPILER # pragma warning(pop) #endif } +/* +** unsigned long to unsigned char +*/ + unsigned char curlx_ultouc(unsigned long ulnum) { #ifdef __INTEL_COMPILER @@ -46,7 +96,25 @@ unsigned char curlx_ultouc(unsigned long ulnum) # pragma warning(disable:810) /* conversion may lose significant bits */ #endif - return (unsigned char)(ulnum & 0xFFUL); + return (unsigned char)(ulnum & (unsigned long) CURL_MASK_UCHAR); + +#ifdef __INTEL_COMPILER +# pragma warning(pop) +#endif +} + +/* +** size_t to signed int +*/ + +int curlx_uztosi(size_t uznum) +{ +#ifdef __INTEL_COMPILER +# pragma warning(push) +# pragma warning(disable:810) /* conversion may lose significant bits */ +#endif + + return (int)(uznum & (size_t) CURL_MASK_SINT); #ifdef __INTEL_COMPILER # pragma warning(pop) diff --git a/lib/warnless.h b/lib/warnless.h index 0976088cd..41688de41 100644 --- a/lib/warnless.h +++ b/lib/warnless.h @@ -27,4 +27,6 @@ unsigned short curlx_ultous(unsigned long ulnum); unsigned char curlx_ultouc(unsigned long ulnum); +int curlx_uztosi(size_t uznum); + #endif /* HEADER_CURL_WARNLESS_H */ diff --git a/tests/server/getpart.c b/tests/server/getpart.c index 3ecc20c99..6f893a8bc 100644 --- a/tests/server/getpart.c +++ b/tests/server/getpart.c @@ -27,8 +27,10 @@ #include "getpart.h" -#define _MPRINTF_REPLACE /* use our functions only */ -#include <curl/mprintf.h> +#define ENABLE_CURLX_PRINTF +/* make the curlx header define all printf() functions to use the curlx_* + versions instead */ +#include "curlx.h" /* from the private lib dir */ /* just to please base64.h we create a fake struct */ struct SessionHandle { @@ -97,7 +99,9 @@ static int readline(char **buffer, size_t *bufsize, FILE *stream) } for(;;) { - if(!fgets(*buffer + offset, (int)(*bufsize - offset), stream)) + int bytestoread = curlx_uztosi(*bufsize - offset); + + if(!fgets(*buffer + offset, bytestoread, stream)) return (offset != 0) ? GPE_OK : GPE_END_OF_FILE ; length = offset + strlen(*buffer + offset); |