[libvirt] [PATCH 1/4] Fix UUID handling in secrets/storage encryption APIs
Daniel Veillard
veillard at redhat.com
Fri Sep 11 16:00:07 UTC 2009
On Fri, Sep 11, 2009 at 03:19:17PM +0100, Daniel P. Berrange wrote:
> Convert all the secret/storage encryption APIs / wire format to
> handle UUIDs in raw format instead of non-canonical printable
> format. Guarentees data format correctness.
[...]
> +++ b/include/libvirt/libvirt.h
> @@ -1467,12 +1467,17 @@ int virConnectNumOfSecrets (virConnectPtr conn);
> int virConnectListSecrets (virConnectPtr conn,
> char **uuids,
> int maxuuids);
> +virSecretPtr virSecretLookupByUUID(virConnectPtr conn,
> + const unsigned char *uuid);
> virSecretPtr virSecretLookupByUUIDString(virConnectPtr conn,
> const char *uuid);
> virSecretPtr virSecretDefineXML (virConnectPtr conn,
> const char *xml,
> unsigned int flags);
> -char * virSecretGetUUIDString (virSecretPtr secret);
> +int virSecretGetUUID (virSecretPtr secret,
> + unsigned char *buf);
> +int virSecretGetUUIDString (virSecretPtr secret,
> + char *buf);
> char * virSecretGetXMLDesc (virSecretPtr secret,
> unsigned int flags);
> int virSecretSetValue (virSecretPtr secret,
explicit ACK, this is better !
[..]
> @@ -4828,7 +4828,7 @@ get_nonnull_storage_vol (virConnectPtr conn, remote_nonnull_storage_vol vol)
> static virSecretPtr
> get_nonnull_secret (virConnectPtr conn, remote_nonnull_secret secret)
> {
> - return virGetSecret (conn, secret.uuid);
> + return virGetSecret (conn, BAD_CAST secret.uuid);
heh I didn't expect BAD_CAST to be used outside libxml2 :-)
[...]
> @@ -1179,7 +1181,9 @@ virGetSecret(virConnectPtr conn, const char *uuid)
> }
> virMutexLock(&conn->lock);
>
> - ret = virHashLookup(conn->secrets, uuid);
> + virUUIDFormat(uuid, uuidstr);
> +
> + ret = virHashLookup(conn->secrets, uuidstr);
Would you mind also removing the
Returns 0 in case of success and -1 in case of error.
comment for virUUIDFormat() as it's void and doesn't do any checking
(it has no way to).
[...]
> /**
> - * virSecretLookupByUUIDString:
> - * @conn: virConnect connection
> - * @uuid: ID of a secret
> + * virSecretLookupByUUID:
> + * @conn: pointer to the hypervisor connection
> + * @uuid: the raw UUID for the secret
> *
> - * Fetches a secret based on uuid.
> + * Try to lookup a secret on the given hypervisor based on its UUID.
+ * uses the 16 bytes of raw data to describe the UUID
> *
> - * Returns the secret on success, or NULL on failure.
> + * Returns a new secret object or NULL in case of failure. If the
> + * secret cannot be found, then VIR_ERR_NO_SECRET error is raised.
> */
> virSecretPtr
> -virSecretLookupByUUIDString(virConnectPtr conn, const char *uuid)
> +virSecretLookupByUUID(virConnectPtr conn, const unsigned char *uuid)
[...]
>
> /**
> + * virSecretLookupByUUIDString:
> + * @conn: pointer to the hypervisor connection
> + * @uuidstr: the string UUID for the secret
> + *
> + * Try to lookup a secret on the given hypervisor based on its UUID.
+ * Uses the printable string value to describe the UUID
> + *
> + * Returns a new secret object or NULL in case of failure. If the
> + * secret cannot be found, then VIR_ERR_NO_SECRET error is raised.
> + */
> +virSecretPtr
> +virSecretLookupByUUIDString(virConnectPtr conn, const char *uuidstr)
> +{
> + int raw[VIR_UUID_BUFLEN], i;
> + unsigned char uuid[VIR_UUID_BUFLEN];
> + int ret;
> +
> + DEBUG("conn=%p, uuidstr=%s", conn, uuidstr);
> +
> + virResetLastError();
> +
> + if (!VIR_IS_CONNECT(conn)) {
> + virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
> + return (NULL);
> + }
> + if (uuidstr == NULL) {
> + virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
> + goto error;
> + }
> + /* XXX: sexpr_uuid() also supports 'xxxx-xxxx-xxxx-xxxx' format.
> + * We needn't it here. Right?
> + */
Hum, I would rather use virUUIDParse() to make sure there is no
confusion, a public API should be tolerant about this I think
and it's cleaner to reuse it !
> + ret = sscanf(uuidstr,
> + "%02x%02x%02x%02x-"
> + "%02x%02x-"
> + "%02x%02x-"
> + "%02x%02x-"
> + "%02x%02x%02x%02x%02x%02x",
> + raw + 0, raw + 1, raw + 2, raw + 3,
> + raw + 4, raw + 5, raw + 6, raw + 7,
> + raw + 8, raw + 9, raw + 10, raw + 11,
> + raw + 12, raw + 13, raw + 14, raw + 15);
> +
> + if (ret!=VIR_UUID_BUFLEN) {
> + virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
> + goto error;
> + }
> + for (i = 0; i < VIR_UUID_BUFLEN; i++)
> + uuid[i] = raw[i] & 0xFF;
ACK, overall an important cleanup, as it affects the API and the
network format !
Daniel
--
Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/
daniel at veillard.com | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library http://libvirt.org/
More information about the libvir-list
mailing list