]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Be more proactive about noticing underflows: size_t values greater than 0x800...00...
authorNick Mathewson <nickm@torproject.org>
Thu, 2 Dec 2004 04:33:01 +0000 (04:33 +0000)
committerNick Mathewson <nickm@torproject.org>
Thu, 2 Dec 2004 04:33:01 +0000 (04:33 +0000)
svn:r3064

src/common/compat.c
src/common/crypto.c
src/common/torint.h
src/common/util.c

index e025bff20754a18f4f8e9c754500691de1bf0775..128ff4a2bbc5175181d0e96f68a39b3d7fc36a67 100644 (file)
@@ -100,6 +100,8 @@ int tor_vsnprintf(char *str, size_t size, const char *format, va_list args)
   int r;
   if (size == 0)
     return -1; /* no place for the NUL */
+  if (size > SIZE_T_CEILING)
+    return -1;
 #ifdef MS_WINDOWS
   r = _vsnprintf(str, size, format, args);
 #else
index a299a0ea13384d649aa6bad0645212887357b32b..6d4533b5da403c470f55de8836d850285c224c73 100644 (file)
@@ -1520,6 +1520,8 @@ base64_encode(char *dest, size_t destlen, const char *src, size_t srclen)
   */
   if (destlen < ((srclen/48)+1)*66)
     return -1;
+  if (destlen > SIZE_T_CEILING)
+    return -1;
 
   EVP_EncodeInit(&ctx);
   EVP_EncodeUpdate(&ctx, dest, &len, (char*) src, srclen);
@@ -1543,6 +1545,8 @@ base64_decode(char *dest, size_t destlen, const char *src, size_t srclen)
   */
   if (destlen < ((srclen/64)+1)*49)
     return -1;
+  if (destlen > SIZE_T_CEILING)
+    return -1;
 
   EVP_DecodeInit(&ctx);
   EVP_DecodeUpdate(&ctx, dest, &len, (char*) src, srclen);
@@ -1562,6 +1566,7 @@ base32_encode(char *dest, size_t destlen, const char *src, size_t srclen)
 
   tor_assert((nbits%5) == 0); /* We need an even multiple of 5 bits. */
   tor_assert((nbits/5)+1 <= destlen); /* We need enough space. */
+  tor_assert(destlen < SIZE_T_CEILING);
 
   for (i=0,bit=0; bit < nbits; ++i, bit+=5) {
     /* set v to the 16-bit value starting at src[bits/8], 0-padded. */
@@ -1588,6 +1593,7 @@ secret_to_key(char *key_out, size_t key_out_len, const char *secret,
   uint8_t c;
   size_t count;
   char *tmp;
+  tor_assert(key_out_len < SIZE_T_CEILING);
 
 #define EXPBIAS 6
   c = s2k_specifier[8];
index af2775a8cb96d2738add84ff58ca2675a6881d77..1973db0d816a56056df19de7923cd66b20d1829e 100644 (file)
@@ -232,5 +232,8 @@ typedef uint32_t uintptr_t;
 #endif
 #endif
 
+/* Any size_t larger than this amount is likely to be an underflow. */
+#define SIZE_T_CEILING (1u<<(sizeof(size_t)*8 - 1))
+
 #endif /* __TORINT_H */
 
index 169dbf14bd6298000351a61e681fc3600fafeed4..dd6ff289ee9efe51fcbd89be4608fb002b9857e6 100644 (file)
@@ -18,6 +18,7 @@ const char util_c_id[] = "$Id$";
 #include "util.h"
 #include "log.h"
 #include "crypto.h"
+#include "torint.h"
 
 #ifdef MS_WINDOWS
 #include <io.h>
@@ -218,6 +219,8 @@ int tor_strpartition(char *dest, size_t dest_len,
   tor_assert(s);
   tor_assert(insert);
   tor_assert(n > 0);
+  tor_assert(n < SIZE_T_CEILING);
+  tor_assert(dest_len < SIZE_T_CEILING);
   len_in = strlen(s);
   len_ins = strlen(insert);
   len_out = len_in + (len_in/n)*len_ins;
@@ -444,6 +447,7 @@ void base16_encode(char *dest, size_t destlen, const char *src, size_t srclen)
   char *cp;
 
   tor_assert(destlen >= srclen*2+1);
+  tor_assert(destlen < SIZE_T_CEILING);
 
   cp = dest;
   end = src+srclen;
@@ -477,7 +481,7 @@ int base16_decode(char *dest, size_t destlen, const char *src, size_t srclen)
   int v1,v2;
   if ((srclen % 2) != 0)
     return -1;
-  if (destlen < srclen/2)
+  if (destlen < srclen/2 || destlen > SIZE_T_CEILING)
     return -1;
   end = src+srclen;
   while (src<end) {
@@ -703,6 +707,9 @@ int read_all(int fd, char *buf, size_t count, int isSocket) {
   size_t numread = 0;
   int result;
 
+  if (count > SIZE_T_CEILING)
+    return -1;
+
   while (numread != count) {
     if (isSocket)
       result = recv(fd, buf+numread, count-numread, 0);