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 <thard...@suse.de> --- qemu-queue.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/qemu-queue.h b/qemu-queue.h index 9288cd8..47ed239 100644 --- a/qemu-queue.h +++ b/qemu-queue.h @@ -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) \ -- 1.7.10.4