]> code.delx.au - gnu-emacs/commitdiff
Fix some int overflows in profiler.c
authorPaul Eggert <eggert@cs.ucla.edu>
Fri, 31 Jul 2015 16:55:49 +0000 (09:55 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Fri, 31 Jul 2015 17:13:36 +0000 (10:13 -0700)
* src/profiler.c (make_log): Make args EMACS_INT, not int,
to avoid unwanted behavior on 'int' overflow.
(make_log, evict_lower_half, record_backtrace):
Use ptrdiff_t, not int, for object indexes.

src/profiler.c

index d4c98a8265753c628b1cb95d0e28d6717c1a2fd5..efdb1d9fe14f74d0bfe8202cf1876af028581fef 100644 (file)
@@ -38,7 +38,7 @@ typedef struct Lisp_Hash_Table log_t;
 static struct hash_table_test hashtest_profiler;
 
 static Lisp_Object
-make_log (int heap_size, int max_stack_depth)
+make_log (EMACS_INT heap_size, EMACS_INT max_stack_depth)
 {
   /* We use a standard Elisp hash-table object, but we use it in
      a special way.  This is OK as long as the object is not exposed
@@ -53,7 +53,7 @@ make_log (int heap_size, int max_stack_depth)
 
   /* What is special about our hash-tables is that the keys are pre-filled
      with the vectors we'll put in them.  */
-  int i = ASIZE (h->key_and_value) / 2;
+  ptrdiff_t i = ASIZE (h->key_and_value) >> 1;
   while (i > 0)
     set_hash_key_slot (h, --i,
                       Fmake_vector (make_number (max_stack_depth), Qnil));
@@ -120,12 +120,11 @@ static void evict_lower_half (log_t *log)
          Fremhash (key, tmp);
        }
        eassert (EQ (log->next_free, make_number (i)));
-       {
-         int j;
-         eassert (VECTORP (key));
-         for (j = 0; j < ASIZE (key); j++)
-           ASET (key, j, Qnil);
-       }
+
+       eassert (VECTORP (key));
+       for (ptrdiff_t j = 0; j < ASIZE (key); j++)
+         ASET (key, j, Qnil);
+
        set_hash_key_slot (log, i, key);
       }
 }
@@ -165,9 +164,8 @@ record_backtrace (log_t *log, EMACS_INT count)
     else
       { /* BEWARE!  hash_put in general can allocate memory.
           But currently it only does that if log->next_free is nil.  */
-       int j;
        eassert (!NILP (log->next_free));
-       j = hash_put (log, backtrace, make_number (count), hash);
+       ptrdiff_t j = hash_put (log, backtrace, make_number (count), hash);
        /* Let's make sure we've put `backtrace' right where it
           already was to start with.  */
        eassert (index == j);