[libvirt] [PATCH 3/6] util: string: Introduce virStringEncodeBase64
John Ferlan
jferlan at redhat.com
Fri May 13 18:01:32 UTC 2016
On 05/13/2016 12:04 PM, Peter Krempa wrote:
> Add a new helper that sanitizes error semantics of base64_encode_alloc.
> ---
> src/conf/virsecretobj.c | 7 ++-----
> src/libvirt_private.syms | 1 +
> src/qemu/qemu_agent.c | 6 ++----
> src/storage/storage_backend_rbd.c | 17 ++++-------------
> src/util/virstring.c | 24 ++++++++++++++++++++++++
> src/util/virstring.h | 2 ++
> tools/virsh-secret.c | 6 +++---
> 7 files changed, 38 insertions(+), 25 deletions(-)
>
probably means #include "base64.h" is no longer necessary in places
where the call has been removed.
> diff --git a/src/conf/virsecretobj.c b/src/conf/virsecretobj.c
> index 721e0b4..4babd31 100644
> --- a/src/conf/virsecretobj.c
> +++ b/src/conf/virsecretobj.c
> @@ -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)
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index 9c1abbb..ca2b6b8 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -2302,6 +2302,7 @@ virSkipSpacesBackwards;
> virStrcpy;
> virStrdup;
> virStringArrayHasString;
> +virStringEncodeBase64;
> virStringFreeList;
> virStringFreeListCount;
> virStringGetFirstWithPrefix;
> diff --git a/src/qemu/qemu_agent.c b/src/qemu/qemu_agent.c
> index c55f304..cbc0995 100644
> --- a/src/qemu/qemu_agent.c
> +++ b/src/qemu/qemu_agent.c
> @@ -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,
> diff --git a/src/storage/storage_backend_rbd.c b/src/storage/storage_backend_rbd.c
> index 6e92ff7..ac46b9d 100644
> --- a/src/storage/storage_backend_rbd.c
> +++ b/src/storage/storage_backend_rbd.c
> @@ -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);
>
> diff --git a/src/util/virstring.c b/src/util/virstring.c
> index 735e65b..2702cec 100644
> --- a/src/util/virstring.c
> +++ b/src/util/virstring.c
> @@ -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;
> + }
Don't think the return NULL would be necessary... just return ret
> +
> + return ret;
> +}
> diff --git a/src/util/virstring.h b/src/util/virstring.h
> index fd2868a..6bc2726 100644
> --- a/src/util/virstring.h
> +++ b/src/util/virstring.h
> @@ -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__ */
> diff --git a/tools/virsh-secret.c b/tools/virsh-secret.c
> index 087c2ed..532c4d5 100644
> --- a/tools/virsh-secret.c
> +++ b/tools/virsh-secret.c
> @@ -32,6 +32,7 @@
> #include "viralloc.h"
> #include "virfile.h"
> #include "virutil.h"
> +#include "virstring.h"
> #include "conf/secret_conf.h"
>
> static virSecretPtr
> @@ -265,9 +266,8 @@ 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);
Lost the VIR_FREE(value).... Could be VIR_DISPOSE(value) too.
John
> + if (!(base64 = virStringEncodeBase64(value, value_size)))
> + goto cleanup;
>
> if (base64 == NULL) {
> vshError(ctl, "%s", _("Failed to allocate memory"));
>
More information about the libvir-list
mailing list