]> granicus.if.org Git - libevent/commitdiff
deal with out of memory situations for realloc
authorNiels Provos <provos@gmail.com>
Sat, 15 Sep 2007 00:53:47 +0000 (00:53 +0000)
committerNiels Provos <provos@gmail.com>
Sat, 15 Sep 2007 00:53:47 +0000 (00:53 +0000)
svn:r429

event_rpcgen.py

index 07fdf383f6473e8c659b459769cd9f10832df8b1..ef780be1777fbb03f1b8be141d9167c793e6ba26 100755 (executable)
@@ -931,20 +931,26 @@ class EntryArray(Entry):
             '{',
             '  msg->%s_length++;' % name,
             '  if (msg->%s_length >= msg->%s_num_allocated) { ' % (name, name),
-            '    if (!msg->%s_num_allocated) ' % name,
-            '      msg->%s_num_allocated = 1; ' % name,
+            '    struct %s** new_data = NULL; ' % self._refname,
+            '    int tobe_allocated = msg->%s_num_allocated; ' % name,
+            '    if (!tobe_allocated) ',
+            '      tobe_allocated = 1; ',
             '    else ',
-            '      msg->%s_num_allocated <<= 1; ' % name,
-            '    msg->%s_data = (struct %s**)realloc(msg->%s_data, '
-            '  msg->%s_num_allocated * sizeof(struct %s*));' % (
-            name, self._refname, name, name, self._refname ),
+            '      tobe_allocated <<= 1; ',
+            '    new_data = (struct %s**)realloc(msg->%s_data, '
+            'tobe_allocated * sizeof(struct %s*));' % (
+            self._refname, name, self._refname ),
+            '    if (new_data == NULL) {',
+            '      --msg->%s_length;' % name,
+            '      return (NULL);',
+            '    }',
+            '    msg->%s_data = new_data;' % name,
+            '    msg->%s_num_allocated = tobe_allocated;' % name,
             '  }',
-            '  if (msg->%s_data == NULL)' % name,
-            '    return (NULL);',
             '  msg->%s_data[msg->%s_length - 1] = %s_new();' % (
             name, name, self._refname),
             '  if (msg->%s_data[msg->%s_length - 1] == NULL) {' % (name, name),
-            '    msg->%s_length--; ' % name,
+            '    --msg->%s_length; ' % name,
             '    return (NULL);',
             '  }',
             '  msg->%s_set = 1;' % name,