From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=33336 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PsRFp-00059E-Ek for qemu-devel@nongnu.org; Wed, 23 Feb 2011 21:48:34 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PsRFn-0005rA-EY for qemu-devel@nongnu.org; Wed, 23 Feb 2011 21:48:33 -0500 Received: from tama500.ecl.ntt.co.jp ([129.60.39.148]:32785) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PsRFm-0005l8-F3 for qemu-devel@nongnu.org; Wed, 23 Feb 2011 21:48:30 -0500 Message-ID: <4D65C6DA.40706@lab.ntt.co.jp> Date: Thu, 24 Feb 2011 11:47:54 +0900 From: Yoshiaki Tamura MIME-Version: 1.0 References: <1298468927-19193-1-git-send-email-tamura.yoshiaki@lab.ntt.co.jp> <1298468927-19193-6-git-send-email-tamura.yoshiaki@lab.ntt.co.jp> In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Subject: [Qemu-devel] Re: [PATCH 05/18] vl.c: add deleted flag for deleting the handler. List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: quintela@redhat.com Cc: kwolf@redhat.com, aliguori@us.ibm.com, dlaor@redhat.com, ananth@in.ibm.com, kvm@vger.kernel.org, mst@redhat.com, mtosatti@redhat.com, qemu-devel@nongnu.org, vatsa@linux.vnet.ibm.com, blauwirbel@gmail.com, ohmura.kei@lab.ntt.co.jp, avi@redhat.com, pbonzini@redhat.com, psuriset@linux.vnet.ibm.com, stefanha@linux.vnet.ibm.com Juan Quintela wrote: > Yoshiaki Tamura wrote: >> Make deleting handlers robust against deletion of any elements in a >> handler by using a deleted flag like in file descriptors. >> >> Signed-off-by: Yoshiaki Tamura >> --- >> vl.c | 13 +++++++++---- >> 1 files changed, 9 insertions(+), 4 deletions(-) >> >> diff --git a/vl.c b/vl.c >> index b436952..4e263c3 100644 >> --- a/vl.c >> +++ b/vl.c >> @@ -1158,6 +1158,7 @@ static void nographic_update(void *opaque) >> struct vm_change_state_entry { >> VMChangeStateHandler *cb; >> void *opaque; >> + int deleted; >> QLIST_ENTRY (vm_change_state_entry) entries; >> }; >> >> @@ -1178,8 +1179,7 @@ VMChangeStateEntry *qemu_add_vm_change_state_handler(VMChangeStateHandler *cb, >> >> void qemu_del_vm_change_state_handler(VMChangeStateEntry *e) >> { >> - QLIST_REMOVE (e, entries); >> - qemu_free (e); >> + e->deleted = 1; >> } >> >> void vm_state_notify(int running, int reason) >> @@ -1188,8 +1188,13 @@ void vm_state_notify(int running, int reason) >> >> trace_vm_state_notify(running, reason); >> >> - for (e = vm_change_state_head.lh_first; e; e = e->entries.le_next) { >> - e->cb(e->opaque, running, reason); > > this needs to become: > >> + QLIST_FOREACH(e,&vm_change_state_head, entries) { >> + if (e->deleted) { >> + QLIST_REMOVE(e, entries); >> + qemu_free(e); >> + } else { >> + e->cb(e->opaque, running, reason); >> + } > > VMChangeState_entry *next; > > QLIST_FOREACH_SAFE(e,&vm_change_state_head, entries, next) { > ..... > > Otherwise you are accessing "e" after qemu_free and being put out of > the list. You're right. Thanks. Yoshi > > Later, Juan. >