[前][次][番号順一覧][スレッド一覧]

ruby-changes:24811

From: nobu <ko1@a...>
Date: Fri, 31 Aug 2012 14:03:57 +0900 (JST)
Subject: [ruby-changes:24811] nobu:r36862 (trunk): vm_trace.c: freed memory access

nobu	2012-08-31 14:03:47 +0900 (Fri, 31 Aug 2012)

  New Revision: 36862

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=36862

  Log:
    vm_trace.c: freed memory access
    
    * vm_trace.c (clean_hooks): do not access freed memory.

  Modified files:
    trunk/ChangeLog
    trunk/vm_trace.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 36861)
+++ ChangeLog	(revision 36862)
@@ -1,5 +1,7 @@
-Fri Aug 31 14:02:44 2012  Nobuyoshi Nakada  <nobu@r...>
+Fri Aug 31 14:03:45 2012  Nobuyoshi Nakada  <nobu@r...>
 
+	* vm_trace.c (clean_hooks): do not access freed memory.
+
 	* vm_trace.c (rb_threadptr_exec_event_hooks): fix uninitialized state
 	  when no events is excuted.
 
Index: vm_trace.c
===================================================================
--- vm_trace.c	(revision 36861)
+++ vm_trace.c	(revision 36862)
@@ -249,31 +249,21 @@
 static void
 clean_hooks(rb_hook_list_t *list)
 {
-    rb_event_hook_t *hook = list->hooks, *prev = 0;
+    rb_event_hook_t *hook, **nextp = &list->hooks;
 
     list->events = 0;
     list->need_clean = 0;
 
-    while (hook) {
+    while ((hook = *nextp) != 0) {
 	if (hook->hook_flags & RUBY_HOOK_FLAG_DELETED) {
-	    if (prev == 0) {
-		/* start of list */
-		list->hooks = hook->next;
-	    }
-	    else {
-		prev->next = hook->next;
-	    }
-
+	    *nextp = hook->next;
 	    recalc_remove_ruby_vm_event_flags(hook->events);
 	    xfree(hook);
-	    goto next_iter;
 	}
 	else {
 	    list->events |= hook->events; /* update active events */
+	    nextp = &hook->next;
 	}
-	prev = hook;
-      next_iter:
-	hook = hook->next;
     }
 }
 

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]