[libvirt] [PATCH 2/2] security: Add a new func use stat to get process DAC label

Martin Kletzander mkletzan at redhat.com
Mon Dec 1 10:24:16 UTC 2014


On Mon, Dec 01, 2014 at 05:54:36PM +0800, Luyao Huang wrote:
>When use qemuProcessAttach to attach a qemu process, cannot
>get a right DAC label. Add a new func to get process label
>via stat func. Do not remove virDomainDefGetSecurityLabelDef
>before try to use stat to get process DAC label, because
>There are some other func call virSecurityDACGetProcessLabel.
>
>Signed-off-by: Luyao Huang <lhuang at redhat.com>
>---
> src/security/security_dac.c | 50 +++++++++++++++++++++++++++++++++++++++++++--
> 1 file changed, 48 insertions(+), 2 deletions(-)
>
>diff --git a/src/security/security_dac.c b/src/security/security_dac.c
>index 85253af..2977f71 100644
>--- a/src/security/security_dac.c
>+++ b/src/security/security_dac.c
>@@ -1237,17 +1237,63 @@ virSecurityDACReserveLabel(virSecurityManagerPtr mgr ATTRIBUTE_UNUSED,
> }
>
> static int
>+virSecurityDACGetProcessLabelInternal(pid_t pid,
>+                                      virSecurityLabelPtr seclabel)
>+{
>+    struct stat sb;
>+    char *path = NULL;
>+    char *label = NULL;
>+    int ret = -1;
>+
>+    VIR_INFO("Getting DAC user and group on process '%d'", pid);
>+
>+    if (virAsprintf(&path, "/proc/%d", (int) pid) < 0)
>+        goto cleanup;
>+

This won't work on systems without /proc.

>+    if (stat(path, &sb) < 0)
>+        goto cleanup;
>+

Better use lstat.

>+    if (virAsprintf(&label, "+%u:+%u",
>+                    (unsigned int) sb.st_uid,
>+                    (unsigned int) sb.st_gid) < 0)
>+        goto cleanup;
>+
>+    if (virStrcpy(seclabel->label, label,VIR_SECURITY_LABEL_BUFLEN) == NULL)
>+        goto cleanup;
>+    ret = 0;
>+
>+cleanup:
>+    VIR_FREE(path);
>+    VIR_FREE(label);
>+    return ret;
>+}
>+
>+static int
> virSecurityDACGetProcessLabel(virSecurityManagerPtr mgr ATTRIBUTE_UNUSED,
>                               virDomainDefPtr def,
>-                              pid_t pid ATTRIBUTE_UNUSED,
>+                              pid_t pid,
>                               virSecurityLabelPtr seclabel)
> {
>     virSecurityLabelDefPtr secdef =
>         virDomainDefGetSecurityLabelDef(def, SECURITY_DAC_NAME);
>
>-    if (!secdef || !seclabel)
>+    if (!seclabel)

I wonder whether this won't screw up domain definitions that don't
want to have any seclabel set (those defined with XML), I need to
figure that out.

>         return -1;
>
>+    if (secdef == NULL) {
>+        virReportError(VIR_ERR_INTERNAL_ERROR,
>+                       _("missing label for DAC security "
>+                         "driver in domain %s"), def->name);
>+

This should probably be VIR_DEBUG or VIR_INFO, otherwise you report
error without erroring out (returning -1) and it gets saved for the
connection.

>+        if (virSecurityDACGetProcessLabelInternal(pid, seclabel) < 0) {
>+            virReportError(VIR_ERR_INTERNAL_ERROR,
>+                           _("Cannot get process %d DAC label"),pid);
>+            return -1;

Also two errors will be reported if this fails.

Martin

>+        }
>+
>+        return 0;
>+    }
>+
>     if (secdef->label)
>         ignore_value(virStrcpy(seclabel->label, secdef->label,
>                                VIR_SECURITY_LABEL_BUFLEN));
>--
>1.8.3.1
>
>--
>libvir-list mailing list
>libvir-list at redhat.com
>https://www.redhat.com/mailman/listinfo/libvir-list
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20141201/3e12be7f/attachment-0001.sig>


More information about the libvir-list mailing list