diff --git a/cfg.mk b/cfg.mk index 5d9b554c67bfd82655e3e08135e3792143d9ea64..e93114c83e18d73086cbb696cb6be1c7b2e52749 100644 --- a/cfg.mk +++ b/cfg.mk @@ -421,9 +421,9 @@ sc_prohibit_gethostname: $(_sc_search_regexp) sc_prohibit_readdir: - @prohibit='\breaddir *\(' \ + @prohibit='\b(read|close)dir *\(' \ exclude='exempt from syntax-check' \ - halt='use virDirRead, not readdir' \ + halt='use virDirRead and VIR_DIR_CLOSE' \ $(_sc_search_regexp) sc_prohibit_gettext_noop: diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c index 02b8cd7039da8cacbc70c79ec0a0cceca02490b0..1e4b7198b27b38cf670f4c9f713ad53e041311f2 100644 --- a/src/conf/network_conf.c +++ b/src/conf/network_conf.c @@ -3258,7 +3258,7 @@ virNetworkLoadAllState(virNetworkObjListPtr nets, virNetworkObjEndAPI(&net); } - closedir(dir); + VIR_DIR_CLOSE(dir); return ret; } @@ -3298,7 +3298,7 @@ int virNetworkLoadAllConfigs(virNetworkObjListPtr nets, virNetworkObjEndAPI(&net); } - closedir(dir); + VIR_DIR_CLOSE(dir); return ret; } diff --git a/src/conf/nwfilter_conf.c b/src/conf/nwfilter_conf.c index 3f90f65d1fbe4f45c119fa5f89817e77e457bc9c..56f8b86f7108d1cef83608e508f8954d5b01a261 100644 --- a/src/conf/nwfilter_conf.c +++ b/src/conf/nwfilter_conf.c @@ -3227,7 +3227,7 @@ virNWFilterLoadAllConfigs(virNWFilterObjListPtr nwfilters, virNWFilterObjUnlock(nwfilter); } - closedir(dir); + VIR_DIR_CLOSE(dir); return ret; } diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c index 69321952f09aa08e8a21c94c45ca9a24b505339a..5c044d26534bdd3bc54db55d77672edf0b903193 100644 --- a/src/conf/storage_conf.c +++ b/src/conf/storage_conf.c @@ -1964,7 +1964,7 @@ virStoragePoolLoadAllState(virStoragePoolObjListPtr pools, virStoragePoolObjUnlock(pool); } - closedir(dir); + VIR_DIR_CLOSE(dir); return ret; } @@ -2015,7 +2015,7 @@ virStoragePoolLoadAllConfigs(virStoragePoolObjListPtr pools, VIR_FREE(autostartLink); } - closedir(dir); + VIR_DIR_CLOSE(dir); return ret; } diff --git a/src/conf/virdomainobjlist.c b/src/conf/virdomainobjlist.c index 485671e74b53bd3ff7d9a1ee10e148742bdcafb4..4f7756d64e8d8d4abcfbd9d022163f6c14f0b1b2 100644 --- a/src/conf/virdomainobjlist.c +++ b/src/conf/virdomainobjlist.c @@ -616,7 +616,7 @@ virDomainObjListLoadAllConfigs(virDomainObjListPtr doms, } } - closedir(dir); + VIR_DIR_CLOSE(dir); virObjectUnlock(doms); return ret; } diff --git a/src/conf/virsecretobj.c b/src/conf/virsecretobj.c index c46d22c112d2b7514ef26283f9e2d8580e798034..46042eb6319a0e0d8e60d187812ec44ddbe28e6f 100644 --- a/src/conf/virsecretobj.c +++ b/src/conf/virsecretobj.c @@ -1000,6 +1000,6 @@ virSecretLoadAllConfigs(virSecretObjListPtr secrets, virSecretObjEndAPI(&secret); } - closedir(dir); + VIR_DIR_CLOSE(dir); return 0; } diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index b118d1e3d730f4f1d50deacc2e1fa1d06ce30e48..366a45b9d47ba0f3989f574a760a4e2d50b78734 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1493,6 +1493,7 @@ saferead; safewrite; safezero; virBuildPathInternal; +virDirClose; virDirCreate; virDirRead; virFileAbsPath; diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c index 7c8d2cc9d561dc80441662428adf12f026353f1d..7b021d84f6f421364b7f9372074b9e637131d766 100644 --- a/src/network/bridge_driver.c +++ b/src/network/bridge_driver.c @@ -577,7 +577,7 @@ networkMigrateStateFiles(virNetworkDriverStatePtr driver) ret = 0; cleanup: - closedir(dir); + VIR_DIR_CLOSE(dir); VIR_FREE(oldPath); VIR_FREE(newPath); VIR_FREE(contents); diff --git a/src/openvz/openvz_conf.c b/src/openvz/openvz_conf.c index 820dc2291088a2000aa9939fffa7068fb6dd5d75..ff5e5b891b17b5b4973b2b61e6b6f38df917e4f1 100644 --- a/src/openvz/openvz_conf.c +++ b/src/openvz/openvz_conf.c @@ -1072,7 +1072,7 @@ static int openvzAssignUUIDs(void) openvzSetUUID(vpsid); } - closedir(dp); + VIR_DIR_CLOSE(dp); VIR_FREE(conf_dir); return ret; } diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index ee717f052a6cf2c120cf5c5a5eb66e839498a82d..9657b553a930af771f2c0da186133f61b8b669a9 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -587,8 +587,7 @@ qemuDomainSnapshotLoad(virDomainObjPtr vm, ret = 0; cleanup: - if (dir) - closedir(dir); + VIR_DIR_CLOSE(dir); VIR_FREE(snapDir); virObjectUnref(caps); virObjectUnlock(vm); diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c index e16d5fd0274aea9685b1cacfcea1af3c0a8661e7..84f36159c8f25fad8818585607a20b3b43a38a87 100644 --- a/src/qemu/qemu_hostdev.c +++ b/src/qemu/qemu_hostdev.c @@ -134,9 +134,7 @@ qemuHostdevHostSupportsPassthroughVFIO(void) ret = true; cleanup: - if (iommuDir) - closedir(iommuDir); - + VIR_DIR_CLOSE(iommuDir); return ret; } diff --git a/src/storage/storage_backend.c b/src/storage/storage_backend.c index d041530521888ba96dc4495403ce2afc24683826..4774f5f104d1dd4f2fe49f7f9d639c383751621b 100644 --- a/src/storage/storage_backend.c +++ b/src/storage/storage_backend.c @@ -1946,12 +1946,12 @@ virStorageBackendStablePath(virStoragePoolObjPtr pool, if (virAsprintf(&stablepath, "%s/%s", pool->def->target.path, dent->d_name) == -1) { - closedir(dh); + VIR_DIR_CLOSE(dh); return NULL; } if (virFileLinkPointsTo(stablepath, devpath)) { - closedir(dh); + VIR_DIR_CLOSE(dh); return stablepath; } @@ -1963,7 +1963,7 @@ virStorageBackendStablePath(virStoragePoolObjPtr pool, goto retry; } - closedir(dh); + VIR_DIR_CLOSE(dh); ret_strdup: /* Couldn't find any matching stable link so give back diff --git a/src/storage/storage_backend_fs.c b/src/storage/storage_backend_fs.c index a11df365b0432f4644b10c551c3d40d21a8d8172..152f9f32abb03ce09ec42f6c58c0f657e1767a10 100644 --- a/src/storage/storage_backend_fs.c +++ b/src/storage/storage_backend_fs.c @@ -972,8 +972,7 @@ virStorageBackendFileSystemRefresh(virConnectPtr conn ATTRIBUTE_UNUSED, } if (direrr < 0) goto cleanup; - closedir(dir); - dir = NULL; + VIR_DIR_CLOSE(dir); vol = NULL; if (VIR_ALLOC(target)) @@ -1019,8 +1018,7 @@ virStorageBackendFileSystemRefresh(virConnectPtr conn ATTRIBUTE_UNUSED, ret = 0; cleanup: - if (dir) - closedir(dir); + VIR_DIR_CLOSE(dir); VIR_FORCE_CLOSE(fd); virStorageVolDefFree(vol); virStorageSourceFree(target); diff --git a/src/storage/storage_backend_iscsi.c b/src/storage/storage_backend_iscsi.c index e3a41b62a30f5a77254667ff15941ea433f91e89..ad8633e3eab8e84be99c7edd0ddf040e2620d87f 100644 --- a/src/storage/storage_backend_iscsi.c +++ b/src/storage/storage_backend_iscsi.c @@ -122,7 +122,7 @@ virStorageBackendISCSIGetHostNumber(const char *sysfs_path, if (direrr < 0) retval = -1; - closedir(sysdir); + VIR_DIR_CLOSE(sysdir); out: return retval; } diff --git a/src/storage/storage_backend_scsi.c b/src/storage/storage_backend_scsi.c index be993f19d49cfc06b5dda2f5a06c26ecd1d2dc02..b08d96096da4f21be0cea1f7cf40dce5c630cc56 100644 --- a/src/storage/storage_backend_scsi.c +++ b/src/storage/storage_backend_scsi.c @@ -290,8 +290,7 @@ getNewStyleBlockDevice(const char *lun_path, retval = 0; cleanup: - if (block_dir) - closedir(block_dir); + VIR_DIR_CLOSE(block_dir); VIR_FREE(block_path); return retval; } @@ -387,8 +386,7 @@ getBlockDevice(uint32_t host, retval = 0; cleanup: - if (lun_dir) - closedir(lun_dir); + VIR_DIR_CLOSE(lun_dir); VIR_FREE(lun_path); return retval; } @@ -501,7 +499,7 @@ virStorageBackendSCSIFindLUs(virStoragePoolObjPtr pool, found++; } - closedir(devicedir); + VIR_DIR_CLOSE(devicedir); if (retval < 0) return -1; diff --git a/src/util/vircgroup.c b/src/util/vircgroup.c index 7bab08659f68b9f78a1bfc7b2c4f03e3b96f626b..c76c94f68a2bd7b53fe05e0823cf6cebd4ca08fa 100644 --- a/src/util/vircgroup.c +++ b/src/util/vircgroup.c @@ -3409,7 +3409,7 @@ virCgroupRemoveRecursively(char *grppath) VIR_ERROR(_("Failed to readdir for %s (%d)"), grppath, errno); } - closedir(grpdir); + VIR_DIR_CLOSE(grpdir); VIR_DEBUG("Removing cgroup %s", grppath); if (rmdir(grppath) != 0 && errno != ENOENT) { @@ -3669,9 +3669,7 @@ virCgroupKillRecursiveInternal(virCgroupPtr group, cleanup: virCgroupFree(&subgroup); VIR_FREE(keypath); - if (dp) - closedir(dp); - + VIR_DIR_CLOSE(dp); return ret; } @@ -3993,15 +3991,13 @@ int virCgroupSetOwner(virCgroupPtr cgroup, } VIR_FREE(base); - closedir(dh); - dh = NULL; + VIR_DIR_CLOSE(dh); } ret = 0; cleanup: - if (dh) - closedir(dh); + VIR_DIR_CLOSE(dh); VIR_FREE(entry); VIR_FREE(base); return ret; diff --git a/src/util/virfile.c b/src/util/virfile.c index f47bf391c9084f6232e0c35874eab9d286d66d95..ce8f7fd860b5707ccf03195a54bfee4ae060233c 100644 --- a/src/util/virfile.c +++ b/src/util/virfile.c @@ -667,8 +667,7 @@ static int virFileLoopDeviceOpenSearch(char **dev_name) VIR_DEBUG("No free loop devices available"); VIR_FREE(looppath); } - if (dh) - closedir(dh); + VIR_DIR_CLOSE(dh); return fd; } @@ -807,7 +806,7 @@ virFileNBDDeviceFindUnused(void) _("No free NBD devices")); cleanup: - closedir(dh); + VIR_DIR_CLOSE(dh); return ret; } @@ -994,7 +993,7 @@ int virFileDeleteTree(const char *dir) cleanup: VIR_FREE(filepath); - closedir(dh); + VIR_DIR_CLOSE(dh); return ret; } @@ -2770,6 +2769,15 @@ int virDirRead(DIR *dirp, struct dirent **ent, const char *name) return !!*ent; } +void virDirClose(DIR **dirp) +{ + if (!*dirp) + return; + + closedir(*dirp); /* exempt from syntax-check */ + *dirp = NULL; +} + static int virFileMakePathHelper(char *path, mode_t mode) { diff --git a/src/util/virfile.h b/src/util/virfile.h index dae234e2e486b4627339a3a4a786980493ae64aa..ab9eeba33027fa037ce5bb89b63b6e2ab0f444b2 100644 --- a/src/util/virfile.h +++ b/src/util/virfile.h @@ -232,6 +232,9 @@ int virDirCreate(const char *path, mode_t mode, uid_t uid, gid_t gid, unsigned int flags) ATTRIBUTE_RETURN_CHECK; int virDirRead(DIR *dirp, struct dirent **ent, const char *dirname) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK; +void virDirClose(DIR **dirp) + ATTRIBUTE_NONNULL(1); +# define VIR_DIR_CLOSE(dir) virDirClose(&(dir)) int virFileMakePath(const char *path) ATTRIBUTE_RETURN_CHECK; int virFileMakePathWithMode(const char *path, diff --git a/src/util/virhostcpu.c b/src/util/virhostcpu.c index 0cdba0a0cd8791df1673a6e31c116831cc720fe1..6883466b70f86d3870c3425f33681d1b8c6e04d1 100644 --- a/src/util/virhostcpu.c +++ b/src/util/virhostcpu.c @@ -477,8 +477,7 @@ virHostCPUParseNode(const char *node, ret = processors; cleanup: - if (cpudir) - closedir(cpudir); + VIR_DIR_CLOSE(cpudir); if (cores_maps) for (i = 0; i < sock_max; i++) virBitmapFree(cores_maps[i]); @@ -774,8 +773,7 @@ virHostCPUGetInfoPopulateLinux(FILE *cpuinfo, ret = 0; cleanup: - if (nodedir) - closedir(nodedir); + VIR_DIR_CLOSE(nodedir); virBitmapFree(present_cpus_map); virBitmapFree(online_cpus_map); VIR_FREE(sysfs_nodedir); diff --git a/src/util/virnetdev.c b/src/util/virnetdev.c index 5a4ccc62e34044119933cc796cd22b921c247741..75ec484a4a0ece575fd2591e420af7669a19f8d5 100644 --- a/src/util/virnetdev.c +++ b/src/util/virnetdev.c @@ -3188,7 +3188,7 @@ virNetDevRDMAFeature(const char *ifname, ret = 0; cleanup: - closedir(dirp); + VIR_DIR_CLOSE(dirp); VIR_FREE(eth_devpath); VIR_FREE(ib_devpath); VIR_FREE(eth_res_buf); diff --git a/src/util/virnetdevtap.c b/src/util/virnetdevtap.c index b34cbb7e8ad3a908f430bcb536c7b811e18811a6..eec7614f54c04f97b2414f8df259a109b38d879f 100644 --- a/src/util/virnetdevtap.c +++ b/src/util/virnetdevtap.c @@ -144,7 +144,7 @@ virNetDevTapGetRealDeviceName(char *ifname ATTRIBUTE_UNUSED) cleanup: VIR_FREE(devpath); VIR_FORCE_CLOSE(fd); - closedir(dirp); + VIR_DIR_CLOSE(dirp); return ret; #else return NULL; diff --git a/src/util/virnuma.c b/src/util/virnuma.c index 23064ff377898a445aa1c8f2464be79ee12784a9..b756f7f24278e5b2a9ce6601f160ebcbdec078fd 100644 --- a/src/util/virnuma.c +++ b/src/util/virnuma.c @@ -833,8 +833,7 @@ virNumaGetPages(int node, VIR_FREE(tmp_free); VIR_FREE(tmp_avail); VIR_FREE(tmp_size); - if (dir) - closedir(dir); + VIR_DIR_CLOSE(dir); VIR_FREE(path); return ret; } diff --git a/src/util/virpci.c b/src/util/virpci.c index 095d7068c24407f74733f0dcb5c25a8c569f59d4..5cb5d3ab09f483b78c99f5bff1ccaa33f06d7917 100644 --- a/src/util/virpci.c +++ b/src/util/virpci.c @@ -509,7 +509,7 @@ virPCIDeviceIterDevices(virPCIDeviceIterPredicate predicate, virPCIDeviceFree(check); } - closedir(dir); + VIR_DIR_CLOSE(dir); return ret; } @@ -1993,8 +1993,7 @@ int virPCIDeviceFileIterate(virPCIDevicePtr dev, ret = 0; cleanup: - if (dir) - closedir(dir); + VIR_DIR_CLOSE(dir); VIR_FREE(file); VIR_FREE(pcidir); return ret; @@ -2051,8 +2050,7 @@ virPCIDeviceAddressIOMMUGroupIterate(virPCIDeviceAddressPtr orig, cleanup: VIR_FREE(groupPath); - if (groupDir) - closedir(groupDir); + VIR_DIR_CLOSE(groupDir); return ret; } @@ -2713,7 +2711,7 @@ virPCIGetNetName(char *device_link_sysfs_path, char **netname) break; } - closedir(dir); + VIR_DIR_CLOSE(dir); out: VIR_FREE(pcidev_sysfs_net_path); diff --git a/src/util/virprocess.c b/src/util/virprocess.c index bf6a6df8a6fa92b5592fe484d71af780a7227637..b0ca1ce38af06656e1be786a90a2bea9f1cf4464 100644 --- a/src/util/virprocess.c +++ b/src/util/virprocess.c @@ -637,8 +637,7 @@ int virProcessGetPids(pid_t pid, size_t *npids, pid_t **pids) ret = 0; cleanup: - if (dir) - closedir(dir); + VIR_DIR_CLOSE(dir); VIR_FREE(taskPath); if (ret < 0) VIR_FREE(*pids); diff --git a/src/util/virscsi.c b/src/util/virscsi.c index 66b901791b5961e75de3ef4a2ebc21609d6164a8..72a56614a3eedf9ba668c30c12d0edb2b0e6b715 100644 --- a/src/util/virscsi.c +++ b/src/util/virscsi.c @@ -143,8 +143,7 @@ virSCSIDeviceGetSgName(const char *sysfs_prefix, } cleanup: - if (dir) - closedir(dir); + VIR_DIR_CLOSE(dir); VIR_FREE(path); return sg; } @@ -189,8 +188,7 @@ virSCSIDeviceGetDevName(const char *sysfs_prefix, } cleanup: - if (dir) - closedir(dir); + VIR_DIR_CLOSE(dir); VIR_FREE(path); return name; } diff --git a/src/util/virusb.c b/src/util/virusb.c index 5c39667920390a7aa17bb4e2862171ff9895db90..33b188e624884c47013b6605933b4f1fcb2d706b 100644 --- a/src/util/virusb.c +++ b/src/util/virusb.c @@ -202,9 +202,7 @@ virUSBDeviceSearch(unsigned int vendor, ret = list; cleanup: - if (dir) - closedir(dir); - + VIR_DIR_CLOSE(dir); if (!ret) virObjectUnref(list); return ret; diff --git a/src/util/virutil.c b/src/util/virutil.c index 60da17b2f90df06e44d485263ab4cb85793c792d..a6c1273fd27cd4e1a79ec7dff7645c03b8b8f5a5 100644 --- a/src/util/virutil.c +++ b/src/util/virutil.c @@ -1915,7 +1915,7 @@ virFindSCSIHostByPCI(const char *sysfs_prefix, } cleanup: - closedir(dir); + VIR_DIR_CLOSE(dir); VIR_FREE(unique_path); VIR_FREE(host_link); VIR_FREE(host_path); @@ -2265,7 +2265,7 @@ virGetFCHostNameByWWN(const char *sysfs_prefix, cleanup: # undef READ_WWN - closedir(dir); + VIR_DIR_CLOSE(dir); VIR_FREE(wwnn_path); VIR_FREE(wwpn_path); VIR_FREE(wwnn_buf); @@ -2354,7 +2354,7 @@ virFindFCHostCapableVport(const char *sysfs_prefix) } cleanup: - closedir(dir); + VIR_DIR_CLOSE(dir); VIR_FREE(max_vports); VIR_FREE(vports); return ret; diff --git a/src/xen/xen_inotify.c b/src/xen/xen_inotify.c index d81a35d427783801e2fc259eaaca3d9730cd83c9..cd169e01e1f21dce9d7e89e611d09099d889772b 100644 --- a/src/xen/xen_inotify.c +++ b/src/xen/xen_inotify.c @@ -372,21 +372,21 @@ xenInotifyOpen(virConnectPtr conn, /* Build the full file path */ if (!(path = virFileBuildPath(priv->configDir, ent->d_name, NULL))) { - closedir(dh); + VIR_DIR_CLOSE(dh); return -1; } if (xenInotifyAddDomainConfigInfo(conn, path, now) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Error adding file to config list")); - closedir(dh); + VIR_DIR_CLOSE(dh); VIR_FREE(path); return -1; } VIR_FREE(path); } - closedir(dh); + VIR_DIR_CLOSE(dh); if (direrr < 0) return -1; } diff --git a/src/xen/xm_internal.c b/src/xen/xm_internal.c index f7486b5c25e511e5852046df40e3dd2cdc3e8182..e7ac57e659cb3470782c49743c7ed55eed5087b9 100644 --- a/src/xen/xm_internal.c +++ b/src/xen/xm_internal.c @@ -358,7 +358,7 @@ xenXMConfigCacheRefresh(virConnectPtr conn) /* Build the full file path */ if (!(path = virFileBuildPath(priv->configDir, ent->d_name, NULL))) { - closedir(dh); + VIR_DIR_CLOSE(dh); return -1; } @@ -386,7 +386,7 @@ xenXMConfigCacheRefresh(virConnectPtr conn) args.priv = priv; virHashRemoveSet(priv->configCache, xenXMConfigReaper, &args); - closedir(dh); + VIR_DIR_CLOSE(dh); return ret; } diff --git a/tests/virschematest.c b/tests/virschematest.c index 638fd0f43d61d78d06f95b1b2bb9a2d1c84e2b8e..14a9e2031b78048005966faec814b2a04dd4e5cd 100644 --- a/tests/virschematest.c +++ b/tests/virschematest.c @@ -112,7 +112,7 @@ testSchemaDir(const char *schema, cleanup: VIR_FREE(test_name); VIR_FREE(xml_path); - closedir(dir); + VIR_DIR_CLOSE(dir); return ret; } diff --git a/tools/nss/libvirt_nss.c b/tools/nss/libvirt_nss.c index de34bafbe69311d54c30d0919b4a9431de66128b..d179514945d961bce1a5e622e9a8104fb3e6e4e5 100644 --- a/tools/nss/libvirt_nss.c +++ b/tools/nss/libvirt_nss.c @@ -159,8 +159,7 @@ findLease(const char *name, VIR_FREE(path); } - closedir(dir); - dir = NULL; + VIR_DIR_CLOSE(dir); nleases = virJSONValueArraySize(leases_array); DEBUG("Read %zd leases", nleases); @@ -231,8 +230,7 @@ findLease(const char *name, *errnop = errno; VIR_FREE(tmpAddress); virJSONValueFree(leases_array); - if (dir) - closedir(dir); + VIR_DIR_CLOSE(dir); return ret; }