[Libguestfs] [PATCH 2/7] New internal API: internal_set_libvirt_selinux_label
Matthew Booth
mbooth at redhat.com
Thu Feb 28 13:46:24 UTC 2013
On Thu, 2013-02-28 at 10:57 +0000, Richard W.M. Jones wrote:
> From: "Richard W.M. Jones" <rjones at redhat.com>
>
> This internal API sets two SELinux labels in the handle (the process
> label and the image label -- they are closely related).
>
> If using the libvirt attach-method with SELinux and sVirt, then this
> will cause the following XML to be added to the appliance definition:
>
> <seclabel type=static model=selinux relabel=yes>
> <label>[LABEL HERE]</label>
> <imagelabel>[IMAGELABEL HERE]</imagelabel>
> </seclabel>
We're hard-coding type=static, model=selinux, relabel=yes here. I have
no idea what the implications of this are. Are we sure this is ok? I
guess Dan would be the person to ask.
> It is ignored by other attach-methods.
> ---
> generator/actions.ml | 12 ++++++++++++
> src/guestfs-internal.h | 2 ++
> src/handle.c | 2 ++
> src/launch-libvirt.c | 36 ++++++++++++++++++++++++++++++++++++
> 4 files changed, 52 insertions(+)
>
> diff --git a/generator/actions.ml b/generator/actions.ml
> index 8a8e3ff..59e667d 100644
> --- a/generator/actions.ml
> +++ b/generator/actions.ml
> @@ -2694,6 +2694,18 @@ the default. Else C</var/tmp> is the default." };
> longdesc = "\
> Get the directory used by the handle to store the appliance cache." };
>
> + { defaults with
> + name = "internal_set_libvirt_selinux_label";
> + style = RErr, [String "label"; String "imagelabel"], [];
> + blocking = false;
> + visibility = VInternal;
> + shortdesc = "set SELinux label used by the libvirt attach method";
> + longdesc = "\
> +This internal function sets the SELinux security label (in
> +reality, two labels: the process label and the image label)
> +used by the appliance when the libvirt attach method is selected
> +(it is ignored by other attach methods)." };
> +
> ]
>
> (* daemon_functions are any functions which cause some action
> diff --git a/src/guestfs-internal.h b/src/guestfs-internal.h
> index e1a7d31..78e2bf5 100644
> --- a/src/guestfs-internal.h
> +++ b/src/guestfs-internal.h
> @@ -322,6 +322,8 @@ struct guestfs_h
> virDomainPtr dom; /* libvirt domain */
> } virt;
> #endif
> + char *virt_selinux_label;
> + char *virt_selinux_imagelabel;
> };
>
> /* Per-filesystem data stored for inspect_os. */
> diff --git a/src/handle.c b/src/handle.c
> index c630daf..2f44632 100644
> --- a/src/handle.c
> +++ b/src/handle.c
> @@ -326,6 +326,8 @@ guestfs_close (guestfs_h *g)
>
> if (g->pda)
> hash_free (g->pda);
> + free (g->virt_selinux_label);
> + free (g->virt_selinux_imagelabel);
> free (g->tmpdir);
> free (g->env_tmpdir);
> free (g->int_tmpdir);
> diff --git a/src/launch-libvirt.c b/src/launch-libvirt.c
> index 7db2ce5..0a59cb6 100644
> --- a/src/launch-libvirt.c
> +++ b/src/launch-libvirt.c
> @@ -855,6 +855,31 @@ construct_libvirt_xml_seclabel (guestfs_h *g,
> BAD_CAST "none"));
> XMLERROR (-1, xmlTextWriterEndElement (xo));
> }
> + else if (g->virt_selinux_label) {
> + /* Enable sVirt and pass a custom <seclabel/> inherited from the
> + * original libvirt domain (when guestfs_add_domain was called).
> + * https://bugzilla.redhat.com/show_bug.cgi?id=912499#c7
> + */
> + XMLERROR (-1, xmlTextWriterStartElement (xo, BAD_CAST "seclabel"));
> + XMLERROR (-1,
> + xmlTextWriterWriteAttribute (xo, BAD_CAST "type",
> + BAD_CAST "static"));
> + XMLERROR (-1,
> + xmlTextWriterWriteAttribute (xo, BAD_CAST "model",
> + BAD_CAST "selinux"));
> + XMLERROR (-1,
> + xmlTextWriterWriteAttribute (xo, BAD_CAST "relabel",
> + BAD_CAST "yes"));
> + XMLERROR (-1, xmlTextWriterStartElement (xo, BAD_CAST "label"));
> + XMLERROR (-1, xmlTextWriterWriteString (xo,
> + BAD_CAST g->virt_selinux_label));
> + XMLERROR (-1, xmlTextWriterEndElement (xo));
> + XMLERROR (-1, xmlTextWriterStartElement (xo, BAD_CAST "imagelabel"));
> + XMLERROR (-1, xmlTextWriterWriteString (xo,
> + BAD_CAST g->virt_selinux_imagelabel));
> + XMLERROR (-1, xmlTextWriterEndElement (xo));
> + XMLERROR (-1, xmlTextWriterEndElement (xo));
> + }
>
> return 0;
> }
> @@ -1603,3 +1628,14 @@ struct attach_ops attach_ops_libvirt = {
> };
>
> #endif /* no libvirt or libxml2 at compile time */
> +
> +int
> +guestfs__internal_set_libvirt_selinux_label (guestfs_h *g, const char *label,
> + const char *imagelabel)
> +{
> + free (g->virt_selinux_label);
> + g->virt_selinux_label = safe_strdup (g, label);
> + free (g->virt_selinux_imagelabel);
> + g->virt_selinux_imagelabel = safe_strdup (g, imagelabel);
> + return 0;
> +}
Assuming the hard-coding is acceptable, ACK.
Matt
More information about the Libguestfs
mailing list