summaryrefslogtreecommitdiff
path: root/event_rpcgen.py
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2010-04-23 23:55:30 -0400
committerNick Mathewson <nickm@torproject.org>2010-04-23 23:55:30 -0400
commitf6ab2a2811477547347b395789c0340c38603944 (patch)
tree91efcde513f786c3dfd309af25e23dfe024321ec /event_rpcgen.py
parent94ee1251cb0984ca2683c682dda0bb4ab8148508 (diff)
downloadlibevent-f6ab2a2811477547347b395789c0340c38603944.tar.gz
Fix a memory leak when unmarshalling RPC object arrays
The old code would use type_var_add() for its side-effect of expanding the array, then leak the new object that was added to the array. The new code adds a static function to handle the array resizing.
Diffstat (limited to 'event_rpcgen.py')
-rwxr-xr-xevent_rpcgen.py40
1 files changed, 23 insertions, 17 deletions
diff --git a/event_rpcgen.py b/event_rpcgen.py
index 9eb75762..05f0a362 100755
--- a/event_rpcgen.py
+++ b/event_rpcgen.py
@@ -1134,20 +1134,29 @@ class EntryArray(Entry):
'msg->%(name)s_data[msg->%(name)s_length - 1]' % self.GetTranslation(),
'value')
code = [
+ 'static int',
+ '%(parent_name)s_%(name)s_expand_to_hold_more('
+ 'struct %(parent_name)s *msg)',
+ '{',
+ ' int tobe_allocated = msg->%(name)s_num_allocated;',
+ ' %(ctype)s* new_data = NULL;',
+ ' tobe_allocated = !tobe_allocated ? 1 : tobe_allocated << 1;',
+ ' new_data = (%(ctype)s*) realloc(msg->%(name)s_data,',
+ ' tobe_allocated * sizeof(%(ctype)s));',
+ ' if (new_data == NULL)',
+ ' return -1;',
+ ' msg->%(name)s_data = new_data;',
+ ' msg->%(name)s_num_allocated = tobe_allocated;',
+ ' return 0;'
+ '}',
+ '',
'%(ctype)s %(optpointer)s',
'%(parent_name)s_%(name)s_add('
'struct %(parent_name)s *msg%(optaddarg)s)',
'{',
' if (++msg->%(name)s_length >= msg->%(name)s_num_allocated) {',
- ' int tobe_allocated = msg->%(name)s_num_allocated;',
- ' %(ctype)s* new_data = NULL;',
- ' tobe_allocated = !tobe_allocated ? 1 : tobe_allocated << 1;',
- ' new_data = (%(ctype)s*) realloc(msg->%(name)s_data,',
- ' tobe_allocated * sizeof(%(ctype)s));',
- ' if (new_data == NULL)',
+ ' if (%(parent_name)s_%(name)s_expand_to_hold_more(msg)<0)',
' goto error;',
- ' msg->%(name)s_data = new_data;',
- ' msg->%(name)s_num_allocated = tobe_allocated;',
' }' ]
code = TranslateList(code, self.GetTranslation())
@@ -1193,17 +1202,14 @@ class EntryArray(Entry):
'buf' : buf,
'tag' : tag_name,
'init' : self._entry.GetInitializer()})
- if self._optaddarg:
- code = [
- 'if (%(parent_name)s_%(name)s_add(%(var)s, %(init)s) == NULL)',
- ' return (-1);' ]
- else:
- code = [
- 'if (%(parent_name)s_%(name)s_add(%(var)s) == NULL)',
- ' return (-1);' ]
+ code = [
+ 'if (%(var)s->%(name)s_length >= %(var)s->%(name)s_num_allocated &&',
+ ' %(parent_name)s_%(name)s_expand_to_hold_more(%(var)s) < 0) {',
+ ' puts("HEY NOW");',
+ ' return (-1);',
+ '}']
# the unmarshal code directly returns
- code += [ '--%(var)s->%(name)s_length;' % translate ]
code = TranslateList(code, translate)
self._index = '%(var)s->%(name)s_length' % translate