diff options
| author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-03-01 03:36:33 +0000 |
|---|---|---|
| committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-03-01 03:36:33 +0000 |
| commit | b40893e18152d90ad4a56ca51827cf9e99f98203 (patch) | |
| tree | ddc687cf9e0df395e183df864c77ba2839172eaf /thread.c | |
| parent | add1d90bad4273b3bfe7bbd9d71771023b6a8a53 (diff) | |
| download | ruby-b40893e18152d90ad4a56ca51827cf9e99f98203.tar.gz ruby-b40893e18152d90ad4a56ca51827cf9e99f98203.tar.xz ruby-b40893e18152d90ad4a56ca51827cf9e99f98203.zip | |
* eval_method.c (rb_get_method_body): ent->method may be freed by
GC. [ruby-dev:31819]
* thread.c (remove_event_hook): should not access freed memory.
[ruby-dev:31820]
git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@15654 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'thread.c')
| -rw-r--r-- | thread.c | 9 |
1 files changed, 6 insertions, 3 deletions
@@ -2757,9 +2757,10 @@ rb_add_event_hook(rb_event_hook_func_t func, rb_event_flag_t events, VALUE data) static int remove_event_hook(rb_event_hook_t **root, rb_event_hook_func_t func) { - rb_event_hook_t *prev = NULL, *hook = *root; + rb_event_hook_t *prev = NULL, *hook = *root, *next; while (hook) { + next = hook->next; if (func == 0 || hook->func == func) { if (prev) { prev->next = hook->next; @@ -2769,8 +2770,10 @@ remove_event_hook(rb_event_hook_t **root, rb_event_hook_func_t func) } xfree(hook); } - prev = hook; - hook = hook->next; + else { + prev = hook; + } + hook = next; } return -1; } |
