mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-03 03:25:20 +00:00
secret: Add check/validation for correct usage when LookupByUUID
https://bugzilla.redhat.com/show_bug.cgi?id=1656255 If virSecretGetSecretString is using by secretLookupByUUID, then it's possible the found sec->usageType doesn't match the desired @secretUsageType. If this occurs for the encrypted volume creation processing and a subsequent pool refresh is executed, then the secret used to create the volume will not be found by the storageBackendLoadDefaultSecrets which expects to find secrets by VIR_SECRET_USAGE_TYPE_VOLUME. Add a check to virSecretGetSecretString to avoid the possibility along with an error indicating the incorrect matched types. Signed-off-by: John Ferlan <jferlan@redhat.com> ACKed-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
parent
b7378a6d29
commit
e0eb8a8a69
@ -71,6 +71,23 @@ virSecretGetSecretString(virConnectPtr conn,
|
|||||||
if (!sec)
|
if (!sec)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
|
/* NB: NONE is a byproduct of the qemuxml2argvtest test mocking
|
||||||
|
* for UUID lookups. Normal secret XML processing would fail if
|
||||||
|
* the usage type was NONE and since we have no way to set the
|
||||||
|
* expected usage in that environment, let's just accept NONE */
|
||||||
|
if (sec->usageType != VIR_SECRET_USAGE_TYPE_NONE &&
|
||||||
|
sec->usageType != secretUsageType) {
|
||||||
|
char uuidstr[VIR_UUID_STRING_BUFLEN];
|
||||||
|
|
||||||
|
virUUIDFormat(seclookupdef->u.uuid, uuidstr);
|
||||||
|
virReportError(VIR_ERR_INVALID_ARG,
|
||||||
|
_("secret with uuid %s is of type '%s' not "
|
||||||
|
"expected '%s' type"),
|
||||||
|
uuidstr, virSecretUsageTypeToString(sec->usageType),
|
||||||
|
virSecretUsageTypeToString(secretUsageType));
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
*secret = conn->secretDriver->secretGetValue(sec, secret_size, 0,
|
*secret = conn->secretDriver->secretGetValue(sec, secret_size, 0,
|
||||||
VIR_SECRET_GET_VALUE_INTERNAL_CALL);
|
VIR_SECRET_GET_VALUE_INTERNAL_CALL);
|
||||||
|
|
||||||
|
@ -77,7 +77,9 @@ static virSecretPtr
|
|||||||
fakeSecretLookupByUUID(virConnectPtr conn,
|
fakeSecretLookupByUUID(virConnectPtr conn,
|
||||||
const unsigned char *uuid)
|
const unsigned char *uuid)
|
||||||
{
|
{
|
||||||
return virGetSecret(conn, uuid, 0, "");
|
/* NB: This mocked value could be "tls" or "volume" depending on
|
||||||
|
* which test is being run, we'll leave at NONE (or 0) */
|
||||||
|
return virGetSecret(conn, uuid, VIR_SECRET_USAGE_TYPE_NONE, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
static virSecretDriver fakeSecretDriver = {
|
static virSecretDriver fakeSecretDriver = {
|
||||||
|
Loading…
Reference in New Issue
Block a user