]> xenbits.xensource.com Git - libvirt.git/commitdiff
util: string: Introduce virStringEncodeBase64
authorPeter Krempa <pkrempa@redhat.com>
Fri, 13 May 2016 11:15:15 +0000 (13:15 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Mon, 16 May 2016 10:58:48 +0000 (12:58 +0200)
Add a new helper that sanitizes error semantics of base64_encode_alloc.

src/conf/virsecretobj.c
src/libvirt_private.syms
src/qemu/qemu_agent.c
src/storage/storage_backend_rbd.c
src/util/virstring.c
src/util/virstring.h
tools/virsh-secret.c

index 721e0b4c9f26418c83f426a324366455512daec6..4babd31549d7e94d99f0bd5f7b11a357a1e46eb7 100644 (file)
@@ -30,6 +30,7 @@
 #include "virfile.h"
 #include "virhash.h"
 #include "virlog.h"
+#include "virstring.h"
 #include "base64.h"
 
 #define VIR_FROM_THIS VIR_FROM_SECRET
@@ -730,12 +731,8 @@ virSecretObjSaveData(virSecretObjPtr secret)
     if (!secret->value)
         return 0;
 
-    base64_encode_alloc((const char *)secret->value, secret->value_size,
-                        &base64);
-    if (base64 == NULL) {
-        virReportOOMError();
+    if (!(base64 = virStringEncodeBase64(secret->value, secret->value_size)))
         goto cleanup;
-    }
 
     if (virFileRewrite(secret->base64File, S_IRUSR | S_IWUSR,
                        virSecretRewriteFile, base64) < 0)
index 87d758129de216f9c10c2bd6dcb17959b29e1364..14a9b08f2dc6de1d3bd942c3a2fde31dc39b59cc 100644 (file)
@@ -2303,6 +2303,7 @@ virSkipSpacesBackwards;
 virStrcpy;
 virStrdup;
 virStringArrayHasString;
+virStringEncodeBase64;
 virStringFreeList;
 virStringFreeListCount;
 virStringGetFirstWithPrefix;
index c55f304d5a541d482e493bfd6d8577bcd1269e22..cbc099513439d74b728db383d1036cc8e60cef22 100644 (file)
@@ -2142,11 +2142,9 @@ qemuAgentSetUserPassword(qemuAgentPtr mon,
     virJSONValuePtr reply = NULL;
     char *password64 = NULL;
 
-    base64_encode_alloc(password, strlen(password), &password64);
-    if (!password64) {
-        virReportOOMError();
+    if (!(password64 = virStringEncodeBase64((unsigned char *) password,
+                                             strlen(password))))
         goto cleanup;
-    }
 
     if (!(cmd = qemuAgentMakeCommand("guest-set-user-password",
                                      "b:crypted", crypted,
index 6e92ff7e859998cd8d04b9d45cb91319f29649c5..ac46b9dc8ad7844c2e2309e3e30668a79117f938 100644 (file)
@@ -59,7 +59,7 @@ virStorageBackendRBDOpenRADOSConn(virStorageBackendRBDStatePtr ptr,
     int r = 0;
     virStorageAuthDefPtr authdef = source->auth;
     unsigned char *secret_value = NULL;
-    size_t secret_value_size;
+    size_t secret_value_size = 0;
     char *rados_key = NULL;
     virBuffer mon_host = VIR_BUFFER_INITIALIZER;
     virSecretPtr secret = NULL;
@@ -129,15 +129,8 @@ virStorageBackendRBDOpenRADOSConn(virStorageBackendRBDStatePtr ptr,
             goto cleanup;
         }
 
-        base64_encode_alloc((char *)secret_value,
-                            secret_value_size, &rados_key);
-        memset(secret_value, 0, secret_value_size);
-
-        if (rados_key == NULL) {
-            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                           _("failed to decode the RADOS key"));
+        if (!(rados_key = virStringEncodeBase64(secret_value, secret_value_size)))
             goto cleanup;
-        }
 
         VIR_DEBUG("Found cephx key: %s", rados_key);
         if (rados_conf_set(ptr->cluster, "key", rados_key) < 0) {
@@ -147,8 +140,6 @@ virStorageBackendRBDOpenRADOSConn(virStorageBackendRBDStatePtr ptr,
             goto cleanup;
         }
 
-        memset(rados_key, 0, strlen(rados_key));
-
         if (rados_conf_set(ptr->cluster, "auth_supported", "cephx") < 0) {
             virReportError(VIR_ERR_INTERNAL_ERROR,
                            _("failed to set RADOS option: %s"),
@@ -233,8 +224,8 @@ virStorageBackendRBDOpenRADOSConn(virStorageBackendRBDStatePtr ptr,
     ret = 0;
 
  cleanup:
-    VIR_FREE(secret_value);
-    VIR_FREE(rados_key);
+    VIR_DISPOSE_N(secret_value, secret_value_size);
+    VIR_DISPOSE_STRING(rados_key);
 
     virObjectUnref(secret);
 
index 735e65ba1ef7dcfd868a62203b5e627df7792ecd..2702cecf206f83882cbeeaaeb22ad49e68664d26 100644 (file)
@@ -25,6 +25,7 @@
 #include <stdio.h>
 #include <regex.h>
 
+#include "base64.h"
 #include "c-ctype.h"
 #include "virstring.h"
 #include "viralloc.h"
@@ -1066,3 +1067,26 @@ virStringIsPrintable(const char *str)
 
     return true;
 }
+
+
+/**
+ * virStringEncodeBase64:
+ * @buf: buffer of bytes to encode
+ * @buflen: number of bytes to encode
+ *
+ * Encodes @buf to base 64 and returns the resulting string. The caller is
+ * responsible for freeing the result.
+ */
+char *
+virStringEncodeBase64(const uint8_t *buf, size_t buflen)
+{
+    char *ret;
+
+    base64_encode_alloc((const char *) buf, buflen, &ret);
+    if (!ret) {
+        virReportOOMError();
+        return NULL;
+    }
+
+    return ret;
+}
index fd2868a50f2a25893473c55f3de5483c0486c4d5..6bc2726a17d088f67b75df6ec3cbe0180ba377fe 100644 (file)
@@ -277,4 +277,6 @@ void virStringStripControlChars(char *str);
 
 bool virStringIsPrintable(const char *str);
 
+char *virStringEncodeBase64(const uint8_t *buf, size_t buflen);
+
 #endif /* __VIR_STRING_H__ */
index 087c2ed23a966f12badf50e9e7b4b3ee3993a4be..8588f4cc2a54fd1cff35761f0957e5fc6c71b6ed 100644 (file)
@@ -32,6 +32,7 @@
 #include "viralloc.h"
 #include "virfile.h"
 #include "virutil.h"
+#include "virstring.h"
 #include "conf/secret_conf.h"
 
 static virSecretPtr
@@ -265,20 +266,15 @@ cmdSecretGetValue(vshControl *ctl, const vshCmd *cmd)
     if (value == NULL)
         goto cleanup;
 
-    base64_encode_alloc((char *)value, value_size, &base64);
-    memset(value, 0, value_size);
-    VIR_FREE(value);
-
-    if (base64 == NULL) {
-        vshError(ctl, "%s", _("Failed to allocate memory"));
+    if (!(base64 = virStringEncodeBase64(value, value_size)))
         goto cleanup;
-    }
+
     vshPrint(ctl, "%s", base64);
-    memset(base64, 0, strlen(base64));
-    VIR_FREE(base64);
     ret = true;
 
  cleanup:
+    VIR_DISPOSE_N(value, value_size);
+    VIR_DISPOSE_STRING(base64);
     virSecretFree(secret);
     return ret;
 }