[libvirt PATCH 09/10] qemusecuritymock: Use automatic mutex management

Tim Wiederhake twiederh at redhat.com
Fri Feb 11 10:30:45 UTC 2022


Signed-off-by: Tim Wiederhake <twiederh at redhat.com>
---
 tests/qemusecuritymock.c | 88 +++++++++++++---------------------------
 1 file changed, 29 insertions(+), 59 deletions(-)

diff --git a/tests/qemusecuritymock.c b/tests/qemusecuritymock.c
index 778b0561ac..03c818d8a3 100644
--- a/tests/qemusecuritymock.c
+++ b/tests/qemusecuritymock.c
@@ -137,27 +137,21 @@ virFileGetXAttrQuiet(const char *path,
                      const char *name,
                      char **value)
 {
-    int ret = -1;
-    g_autofree char *key = NULL;
+    g_autofree char *key = get_key(path, name);
     char *val;
+    VIR_LOCK_GUARD lock = virLockGuardLock(&m);
 
-    key = get_key(path, name);
-
-    virMutexLock(&m);
     init_syms();
     init_hash();
 
     if (!(val = virHashLookup(xattr_paths, key))) {
         errno = ENODATA;
-        goto cleanup;
+        return -1;
     }
 
     *value = g_strdup(val);
 
-    ret = 0;
- cleanup:
-    virMutexUnlock(&m);
-    return ret;
+    return 0;
 }
 
 
@@ -193,25 +187,18 @@ int virFileSetXAttr(const char *path,
                     const char *name,
                     const char *value)
 {
-    int ret = -1;
-    g_autofree char *key = NULL;
-    g_autofree char *val = NULL;
-
-    key = get_key(path, name);
-    val = g_strdup(value);
+    g_autofree char *key = get_key(path, name);
+    g_autofree char *val = g_strdup(value);
+    VIR_LOCK_GUARD lock = virLockGuardLock(&m);
 
-    virMutexLock(&m);
     init_syms();
     init_hash();
 
     if (virHashUpdateEntry(xattr_paths, key, val) < 0)
-        goto cleanup;
+        return -1;
     val = NULL;
 
-    ret = 0;
- cleanup:
-    virMutexUnlock(&m);
-    return ret;
+    return 0;
 }
 
 
@@ -219,18 +206,15 @@ int virFileRemoveXAttr(const char *path,
                        const char *name)
 {
     int ret = -1;
-    g_autofree char *key = NULL;
-
-    key = get_key(path, name);
+    g_autofree char *key = get_key(path, name);
+    VIR_LOCK_GUARD lock = virLockGuardLock(&m);
 
-    virMutexLock(&m);
     init_syms();
     init_hash();
 
     if ((ret = virHashRemoveEntry(xattr_paths, key)) < 0)
         errno = ENODATA;
 
-    virMutexUnlock(&m);
     return ret;
 }
 
@@ -270,8 +254,8 @@ mock_chown(const char *path,
            uid_t uid,
            gid_t gid)
 {
-    uint32_t *val = NULL;
-    int ret = -1;
+    g_autofree uint32_t *val = NULL;
+    VIR_LOCK_GUARD lock = virLockGuardLock(&m);
 
     if (gid >> 16 || uid >> 16) {
         fprintf(stderr, "Attempt to set too high UID or GID: %llu %llu",
@@ -283,18 +267,13 @@ mock_chown(const char *path,
 
     *val = (gid << 16) + uid;
 
-    virMutexLock(&m);
     init_hash();
 
     if (virHashUpdateEntry(chown_paths, path, val) < 0)
-        goto cleanup;
-    val = NULL;
+        return -1;
 
-    ret = 0;
- cleanup:
-    virMutexUnlock(&m);
-    VIR_FREE(val);
-    return ret;
+    val = NULL;
+    return 0;
 }
 
 
@@ -460,13 +439,12 @@ printXATTR(void *payload,
  */
 int checkPaths(GHashTable *paths)
 {
-    int ret = -1;
     checkOwnerData data = { .paths = paths, .chown_fail = false, .selinux_fail = false };
     bool xattr_fail = false;
     GHashTableIter htitr;
     void *key;
+    VIR_LOCK_GUARD lock = virLockGuardLock(&m);
 
-    virMutexLock(&m);
     init_hash();
 
     g_hash_table_iter_init(&htitr, paths);
@@ -474,38 +452,35 @@ int checkPaths(GHashTable *paths)
     while (g_hash_table_iter_next(&htitr, &key, NULL)) {
         if (!virHashLookup(chown_paths, key)) {
             fprintf(stderr, "Unexpected path restored: %s\n", (const char *) key);
-            goto cleanup;
+            return -1;
         }
     }
 
     if (virHashForEach(selinux_paths, checkSELinux, &data) < 0)
-        goto cleanup;
+        return -1;
 
     if (virHashForEach(chown_paths, checkOwner, &data) < 0)
-        goto cleanup;
+        return -1;
 
     if (virHashForEach(xattr_paths, printXATTR, &xattr_fail) < 0)
-        goto cleanup;
+        return -1;
 
     if (data.chown_fail || data.selinux_fail || xattr_fail)
-        goto cleanup;
+        return -1;
 
-    ret = 0;
- cleanup:
-    virMutexUnlock(&m);
-    return ret;
+    return 0;
 }
 
 
 void freePaths(void)
 {
-    virMutexLock(&m);
+    VIR_LOCK_GUARD lock = virLockGuardLock(&m);
+
     init_hash();
 
     g_clear_pointer(&selinux_paths, g_hash_table_unref);
     g_clear_pointer(&chown_paths, g_hash_table_unref);
     g_clear_pointer(&xattr_paths, g_hash_table_unref);
-    virMutexUnlock(&m);
 }
 
 
@@ -578,19 +553,15 @@ mock_setfilecon_raw(const char *path,
                     const char *context)
 {
     g_autofree char *val = g_strdup(context);
-    int ret = -1;
+    VIR_LOCK_GUARD lock = virLockGuardLock(&m);
 
-    virMutexLock(&m);
     init_hash();
 
     if (virHashUpdateEntry(selinux_paths, path, val) < 0)
-        goto cleanup;
+        return -1;
     val = NULL;
 
-    ret = 0;
- cleanup:
-    virMutexUnlock(&m);
-    return ret;
+    return 0;
 }
 
 
@@ -599,8 +570,8 @@ mock_getfilecon_raw(const char *path,
                     char **context)
 {
     const char *val;
+    VIR_LOCK_GUARD lock = virLockGuardLock(&m);
 
-    virMutexLock(&m);
     init_hash();
 
     val = virHashLookup(selinux_paths, path);
@@ -608,7 +579,6 @@ mock_getfilecon_raw(const char *path,
         val = DEFAULT_SELINUX_LABEL;
 
     *context = g_strdup(val);
-    virMutexUnlock(&m);
     return 0;
 }
 
-- 
2.31.1




More information about the libvir-list mailing list