@@ -141,7 +141,9 @@ struct { \
if ((elm)->field.le_next != NULL) \
(elm)->field.le_next->field.le_prev = \
(elm)->field.le_prev; \
- *(elm)->field.le_prev = (elm)->field.le_next; \
+ if ((elm)->field.le_prev != NULL) { \
+ *(elm)->field.le_prev = (elm)->field.le_next; \
+ } \
} while (/*CONSTCOND*/0)
#define QLIST_FOREACH(var, head, field) \
@@ -381,7 +383,9 @@ struct { \
(elm)->field.tqe_prev; \
else \
(head)->tqh_last = (elm)->field.tqe_prev; \
- *(elm)->field.tqe_prev = (elm)->field.tqe_next; \
+ if ((elm)->field.tqe_prev != NULL) { \
+ *(elm)->field.tqe_prev = (elm)->field.tqe_next; \
+ } \
} while (/*CONSTCOND*/0)
#define QTAILQ_FOREACH(var, head, field) \
When calling QTAILQ_REMOVE or QLIST_REMOVE on an unitialized list QEMU segfaults. Check for this case specifically on item removal. Signed-off-by: Tim Hardeck <thardeck@suse.de> --- qemu-queue.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)