瀏覽代碼

qnetd-algo: Fix list traversal corruption when freeing partitions.

TAILQ_* doesn't have a safe iterator for use when freeing entries, so the
only safe way of doing it (without assuming implementation) is to
restart the iterator after freeing the structure.

Signed-off-by: Christine Caulfield <ccaulfie@redhat.com>
Christine Caulfield 10 年之前
父節點
當前提交
09b904e7ae
共有 1 個文件被更改,包括 4 次插入0 次删除
  1. 4 0
      qdevices/qnetd-algo-utils.c

+ 4 - 0
qdevices/qnetd-algo-utils.c

@@ -131,9 +131,13 @@ qnetd_algo_free_partitions(partitions_list_t *partitions_list)
 {
 {
 	struct qnetd_algo_partition *cur_partition;
 	struct qnetd_algo_partition *cur_partition;
 
 
+restart:
 	TAILQ_FOREACH(cur_partition, partitions_list, entries) {
 	TAILQ_FOREACH(cur_partition, partitions_list, entries) {
 		TAILQ_REMOVE(partitions_list, cur_partition, entries);
 		TAILQ_REMOVE(partitions_list, cur_partition, entries);
 		free(cur_partition);
 		free(cur_partition);
+
+		/* TAILQ doesn't have a safe-removal interator */
+		goto restart;
 	}
 	}
 }
 }