[PATCH v2] selinux label: restore all labels when some labels fail to set
Jin Yan
jinyan12 at huawei.com
Fri Nov 13 09:47:12 UTC 2020
On 2020/11/13 2:54, Michal Privoznik wrote:
> On 11/12/20 3:07 PM, Jin Yan wrote:
>> When migration fails, qemuMigrationDstPrepareAny will call qemuProcessStop
>> to restore labels only after all labels are successfully set. If some labels
>> fail to set, the labels that have been set will not be restored.
>>
>> Signed-off-by: Jin Yan <jinyan12 at huawei.com>
>> ---
>> src/qemu/qemu_security.c | 12 ++++++++++--
>> 1 file changed, 10 insertions(+), 2 deletions(-)
>>
>> diff --git a/src/qemu/qemu_security.c b/src/qemu/qemu_security.c
>> index 3bda96272c..0cb90c840a 100644
>> --- a/src/qemu/qemu_security.c
>> +++ b/src/qemu/qemu_security.c
>> @@ -51,16 +51,24 @@ qemuSecuritySetAllLabel(virQEMUDriverPtr driver,
>> incomingPath,
>> priv->chardevStdioLogd,
>> migrated) < 0)
>> - goto cleanup;
>> + goto restorelabel;
>>
>> if (virSecurityManagerTransactionCommit(driver->securityManager,
>> pid, priv->rememberOwner) < 0)
>> - goto cleanup;
>> + goto restorelabel;
>>
>> ret = 0;
>> +
>> cleanup:
>> virSecurityManagerTransactionAbort(driver->securityManager);
>> return ret;
>> +
>> + restorelabel:
>> + virSecurityManagerRestoreAllLabel(driver->securityManager,
>> + vm->def,
>> + migrated,
>> + priv->chardevStdioLogd);
>> + goto cleanup;
>> }
>>
>>
>>
> I don't think this is correct. Firstly, this restores labels for ALL
> paths, and not just the failed ones (which messes up seclabel
> remembering and its refcounting), but more importantly:
>
> 1) rollback within one secdriver is handled in .transactionCommit
> callback, well virSecurity*TransactionRun() actually,
>
> 2) rollback for other secdrivers after one failed is handled in
> virSecurityStackSetAllLabel().
>
>
> Is this not working properly? What version do you run?
Hi Michal,
I found this problem while performing migration, based on
libvirt version: 6.2.0
SELinux mode: permissive
Steps:
1. start a vm configured with pipe-type serial port.
<serial type='pipe'>
<source path='/tmp/test_pipe'/>
<target type='system-serial' port='1'>
<model name='pl011'/>
</target>
</serial>
2. migrate vm to Dst-side where no '/tmp/test_pipe' exits.
3. migration failed in Dst-side qemuProcessLaunch, and the path's label that
has been set is not restored ('/var/lib/libvirt/qemu/nvram/XXX.fd').
I have no idea why 2)rollback you mentioned didn't work.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20201113/de7fd28c/attachment-0001.htm>
More information about the libvir-list
mailing list