From nobody Tue Feb 10 01:15:54 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 63.128.21.124 as permitted sender) client-ip=63.128.21.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 63.128.21.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1604509701; cv=none; d=zohomail.com; s=zohoarc; b=i9qSzycXa9GOEhEEfbaB2mxZBEvn/pIZTszj34RDa5o8MKfAhcBebU2SXrOiqmZy6M194qETHvSlgG8LeuLxkCA+tP1W/zCnfp8XOt0J/IeRrRd+yWTGbTnfR0HO5tIDRZa2pZG7rtbz/EhRf0vXGr+yJNGdCt6RhqEJOL/BRFk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1604509701; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=WToesQEEsOgA1U+KbjQ1DmCWWPoIm3nAHSDDQfC9l9o=; b=ZtBI12Da2EiQxH4X9TVANnTU2sYPFdbCorXh/14nBMwnIPmSmMA1ccg626GyG2hQ10ihVfxPQXoQcnTcmW4XiP4Jme1EafPR6HBDetnDWyIZ/9PD9mC8yXt7LL/1giEeKMKB/7oHbijAJljvgsDxqgO89ne8GUG7IvgsgsqiIck= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 63.128.21.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [63.128.21.124]) by mx.zohomail.com with SMTPS id 1604509701792912.3703264542588; Wed, 4 Nov 2020 09:08:21 -0800 (PST) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-285-p3VFHsGrNEOr6UtEp0MywQ-1; Wed, 04 Nov 2020 12:06:20 -0500 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 0D949190A3E9; Wed, 4 Nov 2020 17:06:11 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id DC1725DA33; Wed, 4 Nov 2020 17:06:10 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id ABE0F922F6; Wed, 4 Nov 2020 17:06:10 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 0A4H62BC002191 for ; Wed, 4 Nov 2020 12:06:02 -0500 Received: by smtp.corp.redhat.com (Postfix) id 1759710013C1; Wed, 4 Nov 2020 17:06:02 +0000 (UTC) Received: from speedmetal.redhat.com (unknown [10.40.208.55]) by smtp.corp.redhat.com (Postfix) with ESMTP id 6C2301007516 for ; Wed, 4 Nov 2020 17:06:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1604509700; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=WToesQEEsOgA1U+KbjQ1DmCWWPoIm3nAHSDDQfC9l9o=; b=USFIO4UNFF6JzV+7DoV9nGH9WlJsOxYs5qfmfy+XzIJQNrZF0oW++rDx+uO6U5rGnkrE+C SI8/OO6CFJbOa3k72VNG1eQbcrh41VT2CLxa8RfFPzYcxrM1Ej21jHghrodrIq6OhWqJTQ 3/Ivk/qw0kvfbJlK3JnG24tVIVxgBfs= X-MC-Unique: p3VFHsGrNEOr6UtEp0MywQ-1 From: Peter Krempa To: libvir-list@redhat.com Subject: [PATCH v2 07/12] util: hash: Use virHashForEachSafe in places which might delete the element Date: Wed, 4 Nov 2020 18:05:43 +0100 Message-Id: In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-loop: libvir-list@redhat.com X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" Convert all calls to virHashForEach where it's not obvious that the callback is _not_ deleting the current element from the hash to virHashForEachSafe which will be deemed safe to do such operation. Now that no iterator used with virHashForEach deletes current element we can document that virHashForEach must not touch the hash table in any way. Signed-off-by: Peter Krempa --- src/conf/virchrdev.c | 2 +- src/conf/virdomainmomentobjlist.c | 2 +- src/conf/virdomainobjlist.c | 2 +- src/conf/virnetworkobj.c | 4 ++-- src/conf/virnwfilterbindingobjlist.c | 2 +- src/conf/virstorageobj.c | 4 ++-- src/util/virhash.c | 4 +++- tests/virhashtest.c | 2 +- 8 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/conf/virchrdev.c b/src/conf/virchrdev.c index 5e5c03d03b..f35ae6a93e 100644 --- a/src/conf/virchrdev.c +++ b/src/conf/virchrdev.c @@ -299,7 +299,7 @@ void virChrdevFree(virChrdevsPtr devs) return; virMutexLock(&devs->lock); - virHashForEach(devs->hash, virChrdevFreeClearCallbacks, NULL); + virHashForEachSafe(devs->hash, virChrdevFreeClearCallbacks, NULL); virHashFree(devs->hash); virMutexUnlock(&devs->lock); virMutexDestroy(&devs->lock); diff --git a/src/conf/virdomainmomentobjlist.c b/src/conf/virdomainmomentob= jlist.c index 511bf1d415..5665819874 100644 --- a/src/conf/virdomainmomentobjlist.c +++ b/src/conf/virdomainmomentobjlist.c @@ -475,7 +475,7 @@ virDomainMomentForEach(virDomainMomentObjListPtr moment= s, virHashIterator iter, void *data) { - return virHashForEach(moments->objs, iter, data); + return virHashForEachSafe(moments->objs, iter, data); } diff --git a/src/conf/virdomainobjlist.c b/src/conf/virdomainobjlist.c index 9c10090b32..6767fb308e 100644 --- a/src/conf/virdomainobjlist.c +++ b/src/conf/virdomainobjlist.c @@ -837,7 +837,7 @@ virDomainObjListForEach(virDomainObjListPtr doms, virObjectRWLockWrite(doms); else virObjectRWLockRead(doms); - virHashForEach(doms->objs, virDomainObjListHelper, &data); + virHashForEachSafe(doms->objs, virDomainObjListHelper, &data); virObjectRWUnlock(doms); return data.ret; } diff --git a/src/conf/virnetworkobj.c b/src/conf/virnetworkobj.c index 8b3eb0f41c..f5e35dbca4 100644 --- a/src/conf/virnetworkobj.c +++ b/src/conf/virnetworkobj.c @@ -1468,7 +1468,7 @@ virNetworkObjListForEach(virNetworkObjListPtr nets, struct virNetworkObjListForEachHelperData data =3D { .callback =3D callback, .opaque =3D opaque, .ret =3D 0}; virObjectRWLockRead(nets); - virHashForEach(nets->objs, virNetworkObjListForEachHelper, &data); + virHashForEachSafe(nets->objs, virNetworkObjListForEachHelper, &data); virObjectRWUnlock(nets); return data.ret; } @@ -1841,7 +1841,7 @@ virNetworkObjPortForEach(virNetworkObjPtr obj, void *opaque) { virNetworkObjPortListForEachData data =3D { iter, opaque, false }; - virHashForEach(obj->ports, virNetworkObjPortForEachCallback, &data); + virHashForEachSafe(obj->ports, virNetworkObjPortForEachCallback, &data= ); if (data.err) return -1; return 0; diff --git a/src/conf/virnwfilterbindingobjlist.c b/src/conf/virnwfilterbin= dingobjlist.c index 194348d062..e1b7f0622e 100644 --- a/src/conf/virnwfilterbindingobjlist.c +++ b/src/conf/virnwfilterbindingobjlist.c @@ -364,7 +364,7 @@ virNWFilterBindingObjListForEach(virNWFilterBindingObjL= istPtr bindings, callback, opaque, 0, }; virObjectRWLockRead(bindings); - virHashForEach(bindings->objs, virNWFilterBindingObjListHelper, &data); + virHashForEachSafe(bindings->objs, virNWFilterBindingObjListHelper, &d= ata); virObjectRWUnlock(bindings); return data.ret; } diff --git a/src/conf/virstorageobj.c b/src/conf/virstorageobj.c index 4aff62434f..d7a9003783 100644 --- a/src/conf/virstorageobj.c +++ b/src/conf/virstorageobj.c @@ -465,7 +465,7 @@ virStoragePoolObjListForEach(virStoragePoolObjListPtr p= ools, struct _virStoragePoolObjListForEachData data =3D { .iter =3D iter, .opaque =3D opaque }; - virHashForEach(pools->objs, virStoragePoolObjListForEachCb, &data); + virHashForEachSafe(pools->objs, virStoragePoolObjListForEachCb, &data); } @@ -753,7 +753,7 @@ virStoragePoolObjForEachVolume(virStoragePoolObjPtr obj, .iter =3D iter, .opaque =3D opaque }; virObjectRWLockRead(obj->volumes); - virHashForEach(obj->volumes->objsKey, virStoragePoolObjForEachVolumeCb, + virHashForEachSafe(obj->volumes->objsKey, virStoragePoolObjForEachVolu= meCb, &data); virObjectRWUnlock(obj->volumes); return 0; diff --git a/src/util/virhash.c b/src/util/virhash.c index e54052985f..4f8df8fae3 100644 --- a/src/util/virhash.c +++ b/src/util/virhash.c @@ -490,7 +490,9 @@ virHashRemoveEntry(virHashTablePtr table, const char *n= ame) * * The elements are iterated in arbitrary order. * - * virHashForEach, virHashForEachSafe allow the callback to remove the cur= rent + * virHashForEach prohibits @iter from modifying @table + * + * virHashForEachSafe allows the callback to remove the current * element using virHashRemoveEntry but calling other virHash* functions is * prohibited. Note that removing the entry invalidates @key and @payload = in * the callback. diff --git a/tests/virhashtest.c b/tests/virhashtest.c index 93949d8b7a..4e1d41395f 100644 --- a/tests/virhashtest.c +++ b/tests/virhashtest.c @@ -218,7 +218,7 @@ testHashRemoveForEach(const void *data) if (!(hash =3D testHashInit())) return -1; - if (virHashForEach(hash, (virHashIterator) info->data, hash)) { + if (virHashForEachSafe(hash, (virHashIterator) info->data, hash)) { VIR_TEST_VERBOSE("\nvirHashForEach didn't go through all entries"); goto cleanup; } --=20 2.26.2