[tor-commits] [obfsproxy/master] Fix container.c:smartlist_ensure_capacity() overflow.

nickm at torproject.org nickm at torproject.org
Fri Jan 13 15:45:34 UTC 2012


commit 7f75f0df973a6dee679e93bd2d8cae23af81728f
Author: George Kadianakis <desnacked at riseup.net>
Date:   Fri Jan 13 17:38:57 2012 +0200

    Fix container.c:smartlist_ensure_capacity() overflow.
    
    Fixes tor's bug #4230.
---
 src/container.c |   19 ++++++++++++++-----
 1 files changed, 14 insertions(+), 5 deletions(-)

diff --git a/src/container.c b/src/container.c
index b66a819..e579e91 100644
--- a/src/container.c
+++ b/src/container.c
@@ -55,13 +55,22 @@ smartlist_clear(smartlist_t *sl)
 static inline void
 smartlist_ensure_capacity(smartlist_t *sl, int size)
 {
+#if SIZEOF_SIZE_T > SIZEOF_INT
+#define MAX_CAPACITY (INT_MAX)
+#else
+#define MAX_CAPACITY (int)((SIZE_MAX / (sizeof(void*))))
+#endif
   if (size > sl->capacity) {
-    int higher = sl->capacity * 2;
-    while (size > higher)
-      higher *= 2;
-    obfs_assert(higher > 0); /* detect overflow */
+    int higher = sl->capacity;
+    if (size > MAX_CAPACITY/2) {
+      obfs_assert(size <= MAX_CAPACITY);
+      higher = MAX_CAPACITY;
+    } else {
+      while (size > higher)
+        higher *= 2;
+    }
     sl->capacity = higher;
-    sl->list = xrealloc(sl->list, sizeof(void*)*sl->capacity);
+    sl->list = xrealloc(sl->list, sizeof(void*)*((size_t)sl->capacity));
   }
 }
 





More information about the tor-commits mailing list