From nobody Fri May 16 03:43:58 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1501259951742321.9527584154557; Fri, 28 Jul 2017 09:39:11 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 70B35C08EA46; Fri, 28 Jul 2017 16:39:09 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 3F84853CFB; Fri, 28 Jul 2017 16:39:09 +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 A0AFB1805977; Fri, 28 Jul 2017 16:39:08 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v6SGd5pf010331 for ; Fri, 28 Jul 2017 12:39:05 -0400 Received: by smtp.corp.redhat.com (Postfix) id DC22F5D759; Fri, 28 Jul 2017 16:39:05 +0000 (UTC) Received: from localhost.localdomain.com (ovpn-117-46.phx2.redhat.com [10.3.117.46]) by smtp.corp.redhat.com (Postfix) with ESMTP id A158E5D747 for ; Fri, 28 Jul 2017 16:39:05 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 70B35C08EA46 Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=libvir-list-bounces@redhat.com From: John Ferlan To: libvir-list@redhat.com Date: Fri, 28 Jul 2017 12:38:55 -0400 Message-Id: <20170728163901.21444-2-jferlan@redhat.com> In-Reply-To: <20170728163901.21444-1-jferlan@redhat.com> References: <20170728163901.21444-1-jferlan@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 1/7] util: Alter virObjectLockRead to return status 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: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Fri, 28 Jul 2017 16:39:10 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Rather than ignore errors, let's have virObjectLockRead check for the correct usage and issue an error when not properly used so so that we don't run into situations where the resource we think we're locking really isn't locked because the void input parameter wasn't valid. Signed-off-by: John Ferlan --- src/conf/virdomainobjlist.c | 27 ++++++++++++++++++--------- src/util/virobject.c | 6 +++++- src/util/virobject.h | 2 +- 3 files changed, 24 insertions(+), 11 deletions(-) diff --git a/src/conf/virdomainobjlist.c b/src/conf/virdomainobjlist.c index 1d027a4..fed4029 100644 --- a/src/conf/virdomainobjlist.c +++ b/src/conf/virdomainobjlist.c @@ -118,7 +118,8 @@ virDomainObjListFindByIDInternal(virDomainObjListPtr do= ms, bool ref) { virDomainObjPtr obj; - virObjectLockRead(doms); + if (virObjectLockRead(doms) < 0) + return NULL; obj =3D virHashSearch(doms->objs, virDomainObjListSearchID, &id, NULL); if (ref) { virObjectRef(obj); @@ -160,7 +161,8 @@ virDomainObjListFindByUUIDInternal(virDomainObjListPtr = doms, char uuidstr[VIR_UUID_STRING_BUFLEN]; virDomainObjPtr obj; =20 - virObjectLockRead(doms); + if (virObjectLockRead(doms) < 0) + return NULL; virUUIDFormat(uuid, uuidstr); =20 obj =3D virHashLookup(doms->objs, uuidstr); @@ -204,7 +206,8 @@ virDomainObjPtr virDomainObjListFindByName(virDomainObj= ListPtr doms, { virDomainObjPtr obj; =20 - virObjectLockRead(doms); + if (virObjectLockRead(doms) < 0) + return NULL; obj =3D virHashLookup(doms->objsName, name); virObjectRef(obj); virObjectUnlock(doms); @@ -653,7 +656,8 @@ virDomainObjListNumOfDomains(virDomainObjListPtr doms, virConnectPtr conn) { struct virDomainObjListData data =3D { filter, conn, active, 0 }; - virObjectLockRead(doms); + if (virObjectLockRead(doms) < 0) + return -1; virHashForEach(doms->objs, virDomainObjListCount, &data); virObjectUnlock(doms); return data.count; @@ -697,7 +701,8 @@ virDomainObjListGetActiveIDs(virDomainObjListPtr doms, { struct virDomainIDData data =3D { filter, conn, 0, maxids, ids }; - virObjectLockRead(doms); + if (virObjectLockRead(doms) < 0) + return -1; virHashForEach(doms->objs, virDomainObjListCopyActiveIDs, &data); virObjectUnlock(doms); return data.numids; @@ -751,7 +756,8 @@ virDomainObjListGetInactiveNames(virDomainObjListPtr do= ms, struct virDomainNameData data =3D { filter, conn, 0, 0, maxnames, names }; size_t i; - virObjectLockRead(doms); + if (virObjectLockRead(doms) < 0) + return -1; virHashForEach(doms->objs, virDomainObjListCopyInactiveNames, &data); virObjectUnlock(doms); if (data.oom) { @@ -792,7 +798,8 @@ virDomainObjListForEach(virDomainObjListPtr doms, struct virDomainListIterData data =3D { callback, opaque, 0, }; - virObjectLockRead(doms); + if (virObjectLockRead(doms) < 0) + return -1; virHashForEach(doms->objs, virDomainObjListHelper, &data); virObjectUnlock(doms); return data.ret; @@ -925,7 +932,8 @@ virDomainObjListCollect(virDomainObjListPtr domlist, { struct virDomainListData data =3D { NULL, 0 }; =20 - virObjectLockRead(domlist); + if (virObjectLockRead(domlist) < 0) + return -1; sa_assert(domlist->objs); if (VIR_ALLOC_N(data.vms, virHashSize(domlist->objs)) < 0) { virObjectUnlock(domlist); @@ -962,7 +970,8 @@ virDomainObjListConvert(virDomainObjListPtr domlist, *nvms =3D 0; *vms =3D NULL; =20 - virObjectLockRead(domlist); + if (virObjectLockRead(domlist) < 0) + return -1; for (i =3D 0; i < ndoms; i++) { virDomainPtr dom =3D doms[i]; =20 diff --git a/src/util/virobject.c b/src/util/virobject.c index b1bb378..73de4d3 100644 --- a/src/util/virobject.c +++ b/src/util/virobject.c @@ -410,17 +410,21 @@ virObjectLock(void *anyobj) * The object must be unlocked before releasing this * reference. */ -void +int virObjectLockRead(void *anyobj) { if (virObjectIsClass(anyobj, virObjectRWLockableClass)) { virObjectRWLockablePtr obj =3D anyobj; virRWLockRead(&obj->lock); + return 0; } else { virObjectPtr obj =3D anyobj; VIR_WARN("Object %p (%s) is not a virObjectRWLockable instance", anyobj, obj ? obj->klass->name : "(unknown)"); + virReportError(VIR_ERR_INTERNAL_ERROR, + _("unable to obtain rwlock for object=3D%p"), anyob= j); } + return -1; } =20 =20 diff --git a/src/util/virobject.h b/src/util/virobject.h index 5985fad..99910e0 100644 --- a/src/util/virobject.h +++ b/src/util/virobject.h @@ -124,7 +124,7 @@ void virObjectLock(void *lockableobj) ATTRIBUTE_NONNULL(1); =20 -void +int virObjectLockRead(void *lockableobj) ATTRIBUTE_NONNULL(1); =20 --=20 2.9.4 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list