From c144a563ea6f31e82026009dc03ba8f1b5caba84 Mon Sep 17 00:00:00 2001 Message-Id: From: John Ferlan Date: Thu, 17 Sep 2015 11:47:21 +0200 Subject: [PATCH] virfile: Check for existence of dir in virFileDeleteTree https://bugzilla.redhat.com/show_bug.cgi?id=1146886 Commit id 'f1f68ca33' added code to remove the directory paths for auto-generated sockets, but that code could be called before the paths were created resulting in generating error messages from virFileDeleteTree indicating that the file doesn't exist. Rather than "enforce" all callers to make the non-NULL and existence checks, modify the virFileDeleteTree API to silently ignore NULL on input and non-existent directory trees. (cherry picked from commit b421a70811b15a2d1853ee7e47069fdef83f7f22) Signed-off-by: Martin Kletzander Signed-off-by: Jiri Denemark --- src/qemu/qemu_process.c | 6 ++---- src/util/virfile.c | 8 ++++++-- tests/virhostdevtest.c | 2 +- tests/virscsitest.c | 2 +- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index ee1d6b2..301b9bf 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -5272,14 +5272,12 @@ void qemuProcessStop(virQEMUDriverPtr driver, ignore_value(virAsprintf(&tmppath, "%s/domain-%s", cfg->libDir, vm->def->name)); - if (tmppath) - virFileDeleteTree(tmppath); + virFileDeleteTree(tmppath); VIR_FREE(tmppath); ignore_value(virAsprintf(&tmppath, "%s/domain-%s", cfg->channelTargetDir, vm->def->name)); - if (tmppath) - virFileDeleteTree(tmppath); + virFileDeleteTree(tmppath); VIR_FREE(tmppath); ignore_value(virDomainChrDefForeach(vm->def, diff --git a/src/util/virfile.c b/src/util/virfile.c index 7c6e72c..53d4639 100644 --- a/src/util/virfile.c +++ b/src/util/virfile.c @@ -909,13 +909,17 @@ int virFileNBDDeviceAssociate(const char *file, */ int virFileDeleteTree(const char *dir) { - DIR *dh = opendir(dir); + DIR *dh; struct dirent *de; char *filepath = NULL; int ret = -1; int direrr; - if (!dh) { + /* Silently return 0 if passed NULL or directory doesn't exist */ + if (!dir || !virFileExists(dir)) + return 0; + + if (!(dh = opendir(dir))) { virReportSystemError(errno, _("Cannot open dir '%s'"), dir); return -1; diff --git a/tests/virhostdevtest.c b/tests/virhostdevtest.c index 1e93819..065b825 100644 --- a/tests/virhostdevtest.c +++ b/tests/virhostdevtest.c @@ -65,7 +65,7 @@ myCleanup(void) } if (mgr) { - if (mgr->stateDir && !getenv("LIBVIRT_SKIP_CLEANUP")) + if (!getenv("LIBVIRT_SKIP_CLEANUP")) virFileDeleteTree(mgr->stateDir); virObjectUnref(mgr->activePCIHostdevs); diff --git a/tests/virscsitest.c b/tests/virscsitest.c index a86ca28..88286f1 100644 --- a/tests/virscsitest.c +++ b/tests/virscsitest.c @@ -241,7 +241,7 @@ mymain(void) ret = -1; cleanup: - if (tmpdir && getenv("LIBVIRT_SKIP_CLEANUP") == NULL) + if (getenv("LIBVIRT_SKIP_CLEANUP") == NULL) virFileDeleteTree(tmpdir); VIR_FREE(virscsi_prefix); return ret; -- 2.5.3