[libvirt] [PATCH v7 08/19] tpm: Check whether previously found executables were updated

Stefan Berger stefanb at linux.vnet.ibm.com
Thu Jul 25 18:22:04 UTC 2019


Check whether previously found executables were updated and if
so look for them again. This helps to use updated features of
swtpm and its tools upon updating them.

Signed-off-by: Stefan Berger <stefanb at linux.ibm.com>
Reviewed-by: Marc-André Lureau <marcandre.lureau at redhat.com>
---
 src/qemu/qemu_tpm.c |  1 +
 src/util/virtpm.c   | 34 ++++++++++++++++++++++++++++++++++
 2 files changed, 35 insertions(+)

diff --git a/src/qemu/qemu_tpm.c b/src/qemu/qemu_tpm.c
index 7282b01bfe..9f1e7e20ba 100644
--- a/src/qemu/qemu_tpm.c
+++ b/src/qemu/qemu_tpm.c
@@ -20,6 +20,7 @@
 
 #include <config.h>
 
+#include <sys/stat.h>
 #include <sys/types.h>
 #include <unistd.h>
 #include <fcntl.h>
diff --git a/src/util/virtpm.c b/src/util/virtpm.c
index 6df225f4e4..bef6cff3dd 100644
--- a/src/util/virtpm.c
+++ b/src/util/virtpm.c
@@ -78,8 +78,13 @@ virTPMCreateCancelPath(const char *devpath)
  */
 static virMutex swtpm_tools_lock = VIR_MUTEX_INITIALIZER;
 static char *swtpm_path;
+static struct stat swtpm_stat;
+
 static char *swtpm_setup;
+static struct stat swtpm_setup_stat;
+
 static char *swtpm_ioctl;
+static struct stat swtpm_ioctl_stat;
 
 char *
 virTPMGetSwtpm(void)
@@ -139,18 +144,22 @@ virTPMEmulatorInit(void)
     static const struct {
         const char *name;
         char **path;
+        struct stat *stat;
     } prgs[] = {
         {
             .name = "swtpm",
             .path = &swtpm_path,
+            .stat = &swtpm_stat,
         },
         {
             .name = "swtpm_setup",
             .path = &swtpm_setup,
+            .stat = &swtpm_setup_stat,
         },
         {
             .name = "swtpm_ioctl",
             .path = &swtpm_ioctl,
+            .stat = &swtpm_ioctl_stat,
         }
     };
     size_t i;
@@ -160,8 +169,27 @@ virTPMEmulatorInit(void)
     for (i = 0; i < ARRAY_CARDINALITY(prgs); i++) {
         VIR_AUTOFREE(char *) path = NULL;
         bool findit = *prgs[i].path == NULL;
+        struct stat statbuf;
+        char *tmp;
+
+        if (!findit) {
+            /* has executables changed? */
+            if (stat(*prgs[i].path, &statbuf) < 0)
+                findit = true;
+
+            if (!findit &&
+                memcmp(&statbuf.st_mtim,
+                       &prgs[i].stat->st_mtime,
+                       sizeof(statbuf.st_mtim))) {
+                findit = true;
+            }
+        }
 
         if (findit) {
+            tmp = *prgs[i].path;
+            VIR_FREE(tmp);
+            *prgs[i].path = NULL;
+
             path = virFindFileInPath(prgs[i].name);
             if (!path) {
                 virReportSystemError(ENOENT,
@@ -175,7 +203,13 @@ virTPMEmulatorInit(void)
                                path);
                 goto cleanup;
             }
+            if (stat(path, prgs[i].stat) < 0) {
+                virReportSystemError(errno,
+                                     _("Could not stat %s"), path);
+                goto cleanup;
+            }
             *prgs[i].path = path;
+            path = NULL;
         }
     }
 
-- 
2.20.1




More information about the libvir-list mailing list