Browse Source

Bugfix: lowlevel: Use LL_DELETE2 when cleaning up secondary list

Luke Dashjr 12 years ago
parent
commit
dc6b0ed617
2 changed files with 17 additions and 1 deletions
  1. 16 0
      compat.h
  2. 1 1
      lowlevel.c

+ 16 - 0
compat.h

@@ -26,6 +26,22 @@
 
 
 // Missing from uthash before 1.9.7
 // Missing from uthash before 1.9.7
 
 
+#define LL_DELETE2(head,del,next)                                                              \
+do {                                                                                           \
+  LDECLTYPE(head) _tmp;                                                                        \
+  if ((head) == (del)) {                                                                       \
+    (head)=(head)->next;                                                                       \
+  } else {                                                                                     \
+    _tmp = head;                                                                               \
+    while (_tmp->next && (_tmp->next != (del))) {                                              \
+      _tmp = _tmp->next;                                                                       \
+    }                                                                                          \
+    if (_tmp->next) {                                                                          \
+      _tmp->next = ((del)->next);                                                              \
+    }                                                                                          \
+  }                                                                                            \
+} while (0)
+
 #define LL_FOREACH2(head,el,next)                                                              \
 #define LL_FOREACH2(head,el,next)                                                              \
     for(el=head;el;el=(el)->next)
     for(el=head;el;el=(el)->next)
 
 

+ 1 - 1
lowlevel.c

@@ -77,7 +77,7 @@ void lowlevel_scan_free()
 		LL_DELETE(devinfo_list, info);
 		LL_DELETE(devinfo_list, info);
 		LL_FOREACH_SAFE2(info, info2, tmp2, same_devid_next)
 		LL_FOREACH_SAFE2(info, info2, tmp2, same_devid_next)
 		{
 		{
-			LL_DELETE(info, info2);
+			LL_DELETE2(info, info2, same_devid_next);
 			lowlevel_devinfo_free(info2);
 			lowlevel_devinfo_free(info2);
 		}
 		}
 	}
 	}