--- mail/ChangeLog.old	2008-12-18 10:40:25.998422440 +0800
+++ mail/ChangeLog	2008-12-18 10:21:38.276472232 +0800
@@ -1,3 +1,11 @@
+2008-12-18  Norman Wang  <zhichao.wang@sun.com>
+
+	** Fix for bug #558337
+
+	* mail/em-subscribe-editor.c: Create a wrapper class MailMsgListNode of 
+	_zsubscribe_msg message. The MailMsgListNode class is the subclass of
+	EDListNode class. So the _zsubscribe_msg can be added into the EDList. 
+
 2008-11-19  Srinivasa Ragavan  <sragavan@novell.com>
 
 	** Fix for bug #555276
--- mail/em-subscribe-editor.c.old	2008-12-16 15:28:03.365746803 +0800
+++ mail/em-subscribe-editor.c	2008-12-16 16:02:17.257778877 +0800
@@ -111,6 +111,12 @@
 	GtkTreePath *path;
 };
 
+typedef struct _MailMsgListNode MailMsgListNode;
+struct _MailMsgListNode {
+	EDListNode node;	
+	MailMsg *msg;
+};
+
 static void sub_editor_busy(EMSubscribeEditor *se, int dir);
 static int sub_queue_fill_level(EMSubscribe *sub, EMSubscribeNode *node);
 static void sub_selection_changed(GtkTreeSelection *selection, EMSubscribe *sub);
@@ -185,6 +191,7 @@
 	GtkTreeModel *model;
 	EMSubscribeNode *node;
 	gboolean subscribed, issub;
+	MailMsgListNode *msgListNode;
 
 	m->sub->subscribe_id = -1;
 	if (m->sub->cancel)
@@ -209,10 +216,13 @@
 	}
 
 	/* queue any further ones, or if out, update the ui */
-	next = (struct _zsubscribe_msg *)e_dlist_remhead(&m->sub->subscribe);
-	if (next) {
+	msgListNode = (MailMsgListNode *) e_dlist_remhead(&m->sub->subscribe);
+	if (msgListNode) {
+		next = (struct _zsubscribe_msg *) msgListNode->msg;
+	        /* Free the memory of the MailMsgListNode which won't be used anymore. */
+        	g_free(msgListNode);
 		next->sub->subscribe_id = next->base.seq;
-		mail_msg_unordered_push (next);
+                mail_msg_unordered_push (next);
 	} else {
 		/* should it go off the model instead? */
 		sub_selection_changed(gtk_tree_view_get_selection(m->sub->tree), m->sub);
@@ -239,6 +249,7 @@
 sub_subscribe_folder (EMSubscribe *sub, EMSubscribeNode *node, int state, const char *spath)
 {
 	struct _zsubscribe_msg *m;
+	MailMsgListNode *msgListNode;
 	int id;
 
 	m = mail_msg_new (&sub_subscribe_folder_info);
@@ -254,8 +265,10 @@
 		d(printf("running subscribe folder '%s'\n", spath));
 		mail_msg_unordered_push (m);
 	} else {
+		msgListNode = g_malloc0(sizeof(MailMsgListNode)); 
+		msgListNode->msg = (MailMsg *) m;
 		d(printf("queueing subscribe folder '%s'\n", spath));
-		e_dlist_addtail(&sub->subscribe, (EDListNode *)m);
+		e_dlist_addtail(&sub->subscribe, (EDListNode *)msgListNode);
 	}
 
 	return id;
@@ -541,6 +554,7 @@
 sub_destroy(GtkWidget *w, EMSubscribe *sub)
 {
 	struct _zsubscribe_msg *m;
+	MailMsgListNode *msgListNode;	
 
 	d(printf("subscribe closed\n"));
 	sub->cancel = TRUE;
@@ -551,8 +565,12 @@
 	if (sub->subscribe_id != -1)
 		mail_msg_cancel(sub->subscribe_id);
 
-	while ( (m = (struct _zsubscribe_msg *)e_dlist_remhead(&sub->subscribe)) )
+	while ( (msgListNode = (MailMsgListNode *)e_dlist_remhead(&sub->subscribe))) {
+		m = (struct _zsubscribe_msg *) msgListNode->msg;
+		/* Free the memory of MailMsgListNode which won't be used anymore. */
+		g_free(msgListNode);
 		mail_msg_unref(m);
+	}
 
 	sub_unref(sub);
 }
