[libvirt] [PATCH 2/2] remote: fix crash on OOM

Daniel Veillard veillard at redhat.com
Wed Sep 21 08:14:52 UTC 2011


On Tue, Sep 20, 2011 at 12:11:32PM -0600, Eric Blake wrote:
> Bug introduced in commit 675464b.  On an OOM, this would try to
> dereference a char* and free the contents as a pointer, which is
> doomed to failure.
> 
> Adding a syntax check will prevent mistakes like this in the future.
> 
> * cfg.mk (sc_prohibit_internal_functions): New syntax check.
> (exclude_file_name_regexp--sc_prohibit_internal_functions): Add
> exemptions.
> * daemon/remote.c (remoteRelayDomainEventIOError)
> (remoteRelayDomainEventIOErrorReason)
> (remoteRelayDomainEventGraphics, remoteRelayDomainEventBlockJob):
> Use correct free function.
> ---
>  cfg.mk          |   11 ++++++++++-
>  daemon/remote.c |   28 ++++++++++++++--------------
>  2 files changed, 24 insertions(+), 15 deletions(-)
> 
> diff --git a/cfg.mk b/cfg.mk
> index 95c5eff..9f4aa3e 100644
> --- a/cfg.mk
> +++ b/cfg.mk
> @@ -212,7 +212,7 @@ useless_free_options =				\
>  # y virDomainWatchdogDefFree
>  # n virDrvNodeGetCellsFreeMemory (returns int)
>  # n virDrvNodeGetFreeMemory (returns long long)
> -# n virFree (dereferences param)
> +# n virFree - dereferences param
>  # n virFreeError
>  # n virHashFree (takes 2 args)
>  # y virInterfaceDefFree
> @@ -306,6 +306,12 @@ sc_flags_usage:
>  	halt='flags should be unsigned'					\
>  	  $(_sc_search_regexp)
> 
> +# Avoid functions that should only be called via macro counterparts.
> +sc_prohibit_internal_functions:
> +	@prohibit='vir(Free|AllocN?|ReallocN|File(Close|Fclose|Fdopen)) *\(' \
> +	halt='use VIR_ macros instead of internal functions'		\
> +	  $(_sc_search_regexp)
> +
>  # Avoid functions that can lead to double-close bugs.
>  sc_prohibit_close:
>  	@prohibit='([^>.]|^)\<[fp]?close *\('				\
> @@ -706,6 +712,9 @@ exclude_file_name_regexp--sc_prohibit_fork_wrappers = \
> 
>  exclude_file_name_regexp--sc_prohibit_gethostname = ^src/util/util\.c$$
> 
> +exclude_file_name_regexp--sc_prohibit_internal_functions = \
> +  ^src/(util/(memory|util|virfile)\.[hc]|esx/esx_vi\.c)$$
> +
>  exclude_file_name_regexp--sc_prohibit_newline_at_end_of_diagnostic = \
>    ^src/rpc/gendispatch\.pl$$
> 
> diff --git a/daemon/remote.c b/daemon/remote.c
> index 74e759a..245d41c 100644
> --- a/daemon/remote.c
> +++ b/daemon/remote.c
> @@ -250,8 +250,8 @@ static int remoteRelayDomainEventIOError(virConnectPtr conn ATTRIBUTE_UNUSED,
>      return 0;
>  mem_error:
>      virReportOOMError();
> -    virFree(data.srcPath);
> -    virFree(data.devAlias);
> +    VIR_FREE(data.srcPath);
> +    VIR_FREE(data.devAlias);
>      return -1;
>  }
> 
> @@ -296,9 +296,9 @@ static int remoteRelayDomainEventIOErrorReason(virConnectPtr conn ATTRIBUTE_UNUS
> 
>  mem_error:
>      virReportOOMError();
> -    virFree(data.srcPath);
> -    virFree(data.devAlias);
> -    virFree(data.reason);
> +    VIR_FREE(data.srcPath);
> +    VIR_FREE(data.devAlias);
> +    VIR_FREE(data.reason);
>      return -1;
>  }
> 
> @@ -374,17 +374,17 @@ static int remoteRelayDomainEventGraphics(virConnectPtr conn ATTRIBUTE_UNUSED,
> 
>  mem_error:
>      virReportOOMError();
> -    virFree(data.authScheme);
> -    virFree(data.local.node);
> -    virFree(data.local.service);
> -    virFree(data.remote.node);
> -    virFree(data.remote.service);
> +    VIR_FREE(data.authScheme);
> +    VIR_FREE(data.local.node);
> +    VIR_FREE(data.local.service);
> +    VIR_FREE(data.remote.node);
> +    VIR_FREE(data.remote.service);
>      if (data.subject.subject_val != NULL) {
>          for (i = 0 ; i < data.subject.subject_len ; i++) {
> -            virFree(data.subject.subject_val[i].type);
> -            virFree(data.subject.subject_val[i].name);
> +            VIR_FREE(data.subject.subject_val[i].type);
> +            VIR_FREE(data.subject.subject_val[i].name);
>          }
> -        virFree(data.subject.subject_val);
> +        VIR_FREE(data.subject.subject_val);
>      }
>      return -1;
>  }
> @@ -422,7 +422,7 @@ static int remoteRelayDomainEventBlockJob(virConnectPtr conn ATTRIBUTE_UNUSED,
> 
>  mem_error:
>      virReportOOMError();
> -    virFree(data.path);
> +    VIR_FREE(data.path);
>      return -1;
>  }
> 

  Gahhh, I got it wrong, I wanted to use VIR_FREE and failed to notice
my mistake ...
  ACK,

Daniel

-- 
Daniel Veillard      | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
daniel at veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/




More information about the libvir-list mailing list