[libvirt] [PATCH 5/6] Fix error handling in virSecurityManagerGetMountOptions
Laine Stump
laine at laine.org
Sun Nov 25 09:07:50 UTC 2012
On 11/22/2012 11:48 AM, Daniel P. Berrange wrote:
> From: "Daniel P. Berrange" <berrange at redhat.com>
>
> The impls of virSecurityManagerGetMountOptions had no way to
> return errors, since the code was treating 'NULL' as a success
> value. This is somewhat pointless, since the calling code did
> not want NULL in the first place and has to translate it into
> the empty string "". So change the code so that the impls can
> return "" directly, allowing use of NULL for error reporting
> once again
>
> Signed-off-by: Daniel P. Berrange <berrange at redhat.com>
> ---
> src/lxc/lxc_container.c | 10 ++++++----
> src/security/security_apparmor.c | 17 +++++++++++++++++
> src/security/security_manager.c | 5 +----
> src/security/security_nop.c | 15 +++++++++++++--
> src/security/security_selinux.c | 28 +++++++++++++++++-----------
> 5 files changed, 54 insertions(+), 21 deletions(-)
>
> diff --git a/src/lxc/lxc_container.c b/src/lxc/lxc_container.c
> index db1f6ed..ebeaca1 100644
> --- a/src/lxc/lxc_container.c
> +++ b/src/lxc/lxc_container.c
> @@ -571,7 +571,7 @@ static int lxcContainerMountBasicFS(bool pivotRoot,
> */
>
> ignore_value(virAsprintf(&opts,
> - "mode=755,size=65536%s",(sec_mount_options ? sec_mount_options : "")));
> + "mode=755,size=65536%s", sec_mount_options));
> if (!opts) {
> virReportOOMError();
> goto cleanup;
> @@ -1083,7 +1083,7 @@ static int lxcContainerMountFSTmpfs(virDomainFSDefPtr fs,
> char *data = NULL;
>
> if (virAsprintf(&data,
> - "size=%lldk%s", fs->usage, (sec_mount_options ? sec_mount_options : "")) < 0) {
> + "size=%lldk%s", fs->usage, sec_mount_options) < 0) {
> virReportOOMError();
> goto cleanup;
> }
> @@ -1456,7 +1456,7 @@ static int lxcContainerMountCGroups(struct lxcContainerCGroup *mounts,
> }
>
> if (virAsprintf(&opts,
> - "mode=755,size=65536%s",(sec_mount_options ? sec_mount_options : "")) < 0) {
> + "mode=755,size=65536%s", sec_mount_options) < 0) {
> virReportOOMError();
> return -1;
> }
> @@ -1689,7 +1689,9 @@ static int lxcContainerSetupMounts(virDomainDefPtr vmDef,
> if (lxcContainerResolveSymlinks(vmDef) < 0)
> return -1;
>
> - sec_mount_options = virSecurityManagerGetMountOptions(securityDriver, vmDef);
> + if (!(sec_mount_options = virSecurityManagerGetMountOptions(securityDriver, vmDef)))
> + return -1;
> +
> if (root && root->src)
> rc = lxcContainerSetupPivotRoot(vmDef, root, ttyPaths, nttyPaths, sec_mount_options);
> else
> diff --git a/src/security/security_apparmor.c b/src/security/security_apparmor.c
> index 1315fe1..b0cdb65 100644
> --- a/src/security/security_apparmor.c
> +++ b/src/security/security_apparmor.c
> @@ -881,6 +881,21 @@ AppArmorSetTapFDLabel(virSecurityManagerPtr mgr ATTRIBUTE_UNUSED,
> return 0;
> }
>
> +
> +static char *
> +AppArmorGetMountOptions(virSecurityManagerPtr mgr ATTRIBUTE_UNUSED,
> + virDomainDefPtr vm ATTRIBUTE_UNUSED)
> +{
> + char *opts;
> +
> + if (!(opts = strdup(""))) {
> + virReportOOMError();
> + return NULL;
> + }
> + return opts;
> +}
> +
> +
> virSecurityDriver virAppArmorSecurityDriver = {
> .privateDataLen = 0,
> .name = SECURITY_APPARMOR_NAME,
> @@ -918,4 +933,6 @@ virSecurityDriver virAppArmorSecurityDriver = {
>
> .domainSetSecurityImageFDLabel = AppArmorSetImageFDLabel,
> .domainSetSecurityTapFDLabel = AppArmorSetTapFDLabel,
> +
> + .domainGetSecurityMountOptions = AppArmorGetMountOptions,
> };
> diff --git a/src/security/security_manager.c b/src/security/security_manager.c
> index d446607..0ebd53b 100644
> --- a/src/security/security_manager.c
> +++ b/src/security/security_manager.c
> @@ -486,10 +486,7 @@ char *virSecurityManagerGetMountOptions(virSecurityManagerPtr mgr,
> if (mgr->drv->domainGetSecurityMountOptions)
> return mgr->drv->domainGetSecurityMountOptions(mgr, vm);
>
> - /*
> - I don't think this is an error, these should be optional
> - virReportError(VIR_ERR_NO_SUPPORT, __FUNCTION__);
> - */
> + virReportError(VIR_ERR_NO_SUPPORT, __FUNCTION__);
> return NULL;
> }
>
> diff --git a/src/security/security_nop.c b/src/security/security_nop.c
> index 86f644b..5f3270a 100644
> --- a/src/security/security_nop.c
> +++ b/src/security/security_nop.c
> @@ -21,6 +21,10 @@
>
> #include "security_nop.h"
>
> +#include "virterror_internal.h"
> +
> +#define VIR_FROM_THIS VIR_FROM_SECURITY
> +
> static virSecurityDriverStatus virSecurityDriverProbeNop(const char *virtDriver ATTRIBUTE_UNUSED)
> {
> return SECURITY_DRIVER_ENABLE;
> @@ -165,8 +169,15 @@ static int virSecurityDomainSetFDLabelNop(virSecurityManagerPtr mgr ATTRIBUTE_UN
> }
>
> static char *virSecurityDomainGetMountOptionsNop(virSecurityManagerPtr mgr ATTRIBUTE_UNUSED,
> - virDomainDefPtr vm ATTRIBUTE_UNUSED) {
> - return NULL;
> + virDomainDefPtr vm ATTRIBUTE_UNUSED)
> +{
> + char *opts;
> +
> + if (!(opts = strdup(""))) {
> + virReportOOMError();
> + return NULL;
> + }
> + return opts;
> }
>
> virSecurityDriver virSecurityDriverNop = {
> diff --git a/src/security/security_selinux.c b/src/security/security_selinux.c
> index 8fcaaa8..0e49ded 100644
> --- a/src/security/security_selinux.c
> +++ b/src/security/security_selinux.c
> @@ -1974,20 +1974,26 @@ virSecuritySELinuxGetSecurityMountOptions(virSecurityManagerPtr mgr,
> char *opts = NULL;
> virSecurityLabelDefPtr secdef;
>
> - secdef = virDomainDefGetSecurityLabelDef(def, SECURITY_SELINUX_NAME);
> - if (secdef == NULL)
> - return NULL;
> -
> - if (! secdef->imagelabel)
> - secdef->imagelabel = virSecuritySELinuxGenImageLabel(mgr,def);
> + if ((secdef = virDomainDefGetSecurityLabelDef(def, SECURITY_SELINUX_NAME))) {
> + if (!secdef->imagelabel)
> + secdef->imagelabel = virSecuritySELinuxGenImageLabel(mgr,def);
Missing space after comma (was already there, but might as well fix it
while you're moving stuff).
> +
> + if (secdef->imagelabel &&
> + virAsprintf(&opts,
> + ",context=\"%s\"",
> + (const char*) secdef->imagelabel) < 0) {
> + virReportOOMError();
> + return NULL;
> + }
> + }
>
> - if (secdef->imagelabel) {
> - virAsprintf(&opts,
> - ",context=\"%s\"",
> - (const char*) secdef->imagelabel);
> + if (!opts &&
> + !(opts = strdup(""))) {
> + virReportOOMError();
> + return NULL;
> }
>
> - VIR_DEBUG("imageLabel=%s", secdef->imagelabel);
> + VIR_DEBUG("imageLabel=%s opts=%s", secdef->imagelabel, opts);
> return opts;
> }
>
ACK with the space added.
More information about the libvir-list
mailing list