From cff3864fa5c849e2e170ae9fc8df7d6e79f2c38a Mon Sep 17 00:00:00 2001
From: Matt O'Gorman <mogorman@digium.com>
Date: Wed, 22 Feb 2006 20:13:05 +0000
Subject: [PATCH] bug in the linkedlists macros where the prev node was
 improperly managed when doing removals or insertions. also solved issues with
 app_voicemail init. and reload solves bug #6557

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@10766 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 apps/app_voicemail.c           |  1 -
 include/asterisk/linkedlists.h | 10 +++++++---
 2 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c
index 6e19c95c2b..7b9a37dfd7 100644
--- a/apps/app_voicemail.c
+++ b/apps/app_voicemail.c
@@ -5898,7 +5898,6 @@ static int load_config(void)
 	}
 	zones = NULL;
 	zonesl = NULL;
-	AST_LIST_HEAD_INIT(&users);
 	memset(ext_pass_cmd, 0, sizeof(ext_pass_cmd));
 
 	if (cfg) {
diff --git a/include/asterisk/linkedlists.h b/include/asterisk/linkedlists.h
index 49dd3a10dc..17d92c57ab 100644
--- a/include/asterisk/linkedlists.h
+++ b/include/asterisk/linkedlists.h
@@ -298,9 +298,11 @@ struct {								\
 #define AST_LIST_TRAVERSE_SAFE_BEGIN(head, var, field) {				\
 	typeof((head)->first) __list_next;						\
 	typeof((head)->first) __list_prev = NULL;					\
-	for ((var) = (head)->first,  __list_next = (var) ? (var)->field.next : NULL;	\
+	typeof((head)->first) __new_prev = NULL;					\
+	for ((var) = (head)->first, __new_prev = (var),					\
+	      __list_next = (var) ? (var)->field.next : NULL;				\
 	     (var);									\
-	     __list_prev = (var), (var) = __list_next,					\
+	     __list_prev = __new_prev, (var) = __list_next,				\
 	     __list_next = (var) ? (var)->field.next : NULL				\
 	    )
 
@@ -316,6 +318,7 @@ struct {								\
   previous entry, if any).
  */
 #define AST_LIST_REMOVE_CURRENT(head, field)						\
+	__new_prev = __list_prev;							\
 	if (__list_prev)								\
 		__list_prev->field.next = __list_next;					\
 	else										\
@@ -340,7 +343,8 @@ struct {								\
 	} else {							\
 		(elm)->field.next = (head)->first;			\
 		(head)->first = (elm);					\
-	}										\
+	}								\
+	__new_prev = (elm);						\
 } while (0)
 
 /*!
-- 
GitLab