Fix linked list manipulation code (buggy on consecutive deletion)
authorEdward Z. Yang <ezyang@cs.stanford.edu>
Sun, 13 Apr 2014 06:02:13 +0000 (23:02 -0700)
committerEdward Z. Yang <ezyang@cs.stanford.edu>
Sun, 13 Apr 2014 06:36:45 +0000 (23:36 -0700)
Signed-off-by: Edward Z. Yang <ezyang@cs.stanford.edu>
rts/CheckUnload.c
rts/Linker.c

index f1f454c..98f184b 100644 (file)
@@ -298,7 +298,7 @@ void checkUnload (StgClosure *static_objects)
   // marked as unreferenced can be physically unloaded, because we
   // have no references to it.
   prev = NULL;
-  for (oc = unloaded_objects; oc; prev = oc, oc = next) {
+  for (oc = unloaded_objects; oc; oc = next) {
       next = oc->next;
       if (oc->referenced == 0) {
           if (prev == NULL) {
@@ -312,6 +312,7 @@ void checkUnload (StgClosure *static_objects)
       } else {
           IF_DEBUG(linker, debugBelch("Object file still in use: %"
                                       PATH_FMT "\n", oc->fileName));
+          prev = oc;
       }
   }
 
index af26d74..ab235e9 100644 (file)
@@ -3016,8 +3016,8 @@ unloadObj( pathchar *path )
     IF_DEBUG(linker, debugBelch("unloadObj: %" PATH_FMT "\n", path));
 
     prev = NULL;
-    for (oc = objects; oc; prev = oc, oc = next) {
-        next = oc->next;
+    for (oc = objects; oc; oc = next) {
+        next = oc->next; // oc might be freed
 
         if (!pathcmp(oc->fileName,path)) {
 
@@ -3075,6 +3075,8 @@ unloadObj( pathchar *path )
             /* This could be a member of an archive so continue
              * unloading other members. */
             unloadedAnyObj = HS_BOOL_TRUE;
+        } else {
+            prev = oc;
         }
     }