summaryrefslogtreecommitdiffstats
path: root/thread.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-03-01 03:36:33 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-03-01 03:36:33 +0000
commitb40893e18152d90ad4a56ca51827cf9e99f98203 (patch)
treeddc687cf9e0df395e183df864c77ba2839172eaf /thread.c
parentadd1d90bad4273b3bfe7bbd9d71771023b6a8a53 (diff)
downloadruby-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.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/thread.c b/thread.c
index d199a3964..8fc6dd924 100644
--- a/thread.c
+++ b/thread.c
@@ -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;
}