[libvirt] [PATCH v2 7/10] selinux: Resolve resource leak using the default disk label

Marcelo Cerri mhcerri at linux.vnet.ibm.com
Fri Jan 18 14:56:03 UTC 2013


The fix seems correct to me.

On Fri, Jan 18, 2013 at 09:34:13AM -0500, John Ferlan wrote:
> Commit id a994ef2d1 changed the mechanism to store/update the default
> security label from using disk->seclabels[0] to allocating one on the
> fly. That change allocated the label, but never saved it.  This patch
> will save the label. The new virDomainDiskDefAddSecurityLabelDef() is
> a copy of the virDomainDefAddSecurityLabelDef().
> ---
>  src/conf/domain_conf.c          | 51 ++++++++++++++++++++++++++++++-----------
>  src/conf/domain_conf.h          |  3 +++
>  src/security/security_selinux.c |  6 ++---
>  3 files changed, 44 insertions(+), 16 deletions(-)
> 
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 0b9ba13..7640af7 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -16041,26 +16041,51 @@ virDomainDefAddSecurityLabelDef(virDomainDefPtr def, const char *model)
>  {
>      virSecurityLabelDefPtr seclabel = NULL;
> 
> -    if (VIR_ALLOC(seclabel) < 0) {
> -        virReportOOMError();
> -        return NULL;
> -    }
> +    if (VIR_ALLOC(seclabel) < 0)
> +        goto no_memory;
> 
>      if (model) {
>          seclabel->model = strdup(model);
> -        if (seclabel->model == NULL) {
> -            virReportOOMError();
> -            virSecurityLabelDefFree(seclabel);
> -            return NULL;
> -        }
> +        if (seclabel->model == NULL)
> +            goto no_memory;
>      }
> 
> -    if (VIR_EXPAND_N(def->seclabels, def->nseclabels, 1) < 0) {
> -        virReportOOMError();
> -        virSecurityLabelDefFree(seclabel);
> -        return NULL;
> +    if (VIR_EXPAND_N(def->seclabels, def->nseclabels, 1) < 0)
> +        goto no_memory;
> +
> +    def->seclabels[def->nseclabels - 1] = seclabel;
> +
> +    return seclabel;
> +
> +no_memory:
> +    virReportOOMError();
> +    virSecurityLabelDefFree(seclabel);
> +    return NULL;
> +}
> +
> +virSecurityDeviceLabelDefPtr
> +virDomainDiskDefAddSecurityLabelDef(virDomainDiskDefPtr def, const char *model)
> +{
> +    virSecurityDeviceLabelDefPtr seclabel = NULL;
> +
> +    if (VIR_ALLOC(seclabel) < 0)
> +        goto no_memory;
> +
> +    if (model) {
> +        seclabel->model = strdup(model);
> +        if (seclabel->model == NULL)
> +            goto no_memory;
>      }
> +
> +    if (VIR_EXPAND_N(def->seclabels, def->nseclabels, 1) < 0)
> +        goto no_memory;
> +
>      def->seclabels[def->nseclabels - 1] = seclabel;
> 
>      return seclabel;
> +
> +no_memory:
> +    virReportOOMError();
> +    virSecurityDeviceLabelDefFree(seclabel);
> +    return NULL;
>  }
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index ce36003..9770ffb 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -2222,6 +2222,9 @@ virDomainChrDefGetSecurityLabelDef(virDomainChrDefPtr def, const char *model);
>  virSecurityLabelDefPtr
>  virDomainDefAddSecurityLabelDef(virDomainDefPtr def, const char *model);
> 
> +virSecurityDeviceLabelDefPtr
> +virDomainDiskDefAddSecurityLabelDef(virDomainDiskDefPtr def, const char *model);
> +
>  typedef const char* (*virEventActionToStringFunc)(int type);
>  typedef int (*virEventActionFromStringFunc)(const char *type);
> 
> diff --git a/src/security/security_selinux.c b/src/security/security_selinux.c
> index b5e1a9a..511e923 100644
> --- a/src/security/security_selinux.c
> +++ b/src/security/security_selinux.c
> @@ -1095,10 +1095,10 @@ virSecuritySELinuxSetSecurityFileLabel(virDomainDiskDefPtr disk,
>      if (ret == 1 && !disk_seclabel) {
>          /* If we failed to set a label, but virt_use_nfs let us
>           * proceed anyway, then we don't need to relabel later.  */
> -        if (VIR_ALLOC(disk_seclabel) < 0) {
> -            virReportOOMError();
> +        disk_seclabel =
> +            virDomainDiskDefAddSecurityLabelDef(disk, SECURITY_SELINUX_NAME);
> +        if (!disk_seclabel)
>              return -1;
> -        }
>          disk_seclabel->norelabel = true;
>          ret = 0;
>      }
> -- 
> 1.7.11.7
> 
> --
> libvir-list mailing list
> libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list
> 




More information about the libvir-list mailing list