[libvirt] [PATCH 3/5] virstring: Introduce virVasprintfNOOM and make virVasprintf report OOM

Eric Blake eblake at redhat.com
Tue Apr 2 20:19:35 UTC 2013


On 04/02/2013 08:22 AM, Michal Privoznik wrote:
> ---
>  src/libvirt_private.syms |  1 +
>  src/qemu/qemu_domain.c   |  4 +---
>  src/util/viraudit.c      |  2 +-
>  src/util/vircommand.c    |  4 ++--
>  src/util/virerror.c      |  2 +-
>  src/util/virlog.c        |  2 +-
>  src/util/virstring.c     | 22 ++++++++++++++++++++--
>  src/util/virstring.h     |  3 +++
>  8 files changed, 30 insertions(+), 10 deletions(-)
> 
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index 5060b87..8d1abe7 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -1742,6 +1742,7 @@ virStrToLong_ul;
>  virStrToLong_ull;
>  virTrimSpaces;
>  virVasprintf;
> +virVasprintfNOOM;

Bike-shedding: Maybe virVasprintfQuiet works better?  I'm a bit worried
that the NOOM suffix will cause more questions than it resolves about
what it is really doing, which is being silent on OOM conditions.

> +++ b/src/qemu/qemu_domain.c
> @@ -1477,10 +1477,8 @@ int qemuDomainAppendLog(virQEMUDriverPtr driver,
>          (fd = qemuDomainCreateLog(driver, obj, true)) < 0)
>          goto cleanup;
>  
> -    if (virVasprintf(&message, fmt, argptr) < 0) {
> -        virReportOOMError();
> +    if (virVasprintf(&message, fmt, argptr) < 0)
>          goto cleanup;
> -    }

This hunk looks like it is in the wrong patch.  Probably meant for 5/5?

> +++ b/src/util/viraudit.c
> @@ -96,7 +96,7 @@ void virAuditSend(const char *filename,
>  #endif
>  
>      va_start(args, fmt);
> -    if (virVasprintf(&str, fmt, args) < 0) {
> +    if (virVasprintfNOOM(&str, fmt, args) < 0) {
>          VIR_WARN("Out of memory while formatting audit message");
>          str = NULL;

The str=NULL assignment is redundant with the guarantees of
virVasprintf*(), if you want to clean that up while you are touching
this area of code.

> +++ b/src/util/virerror.c
> @@ -649,7 +649,7 @@ virRaiseErrorFull(const char *filename ATTRIBUTE_UNUSED,
>      } else {
>          va_list ap;
>          va_start(ap, fmt);
> -        ignore_value(virVasprintf(&str, fmt, ap));
> +        ignore_value(virVasprintfNOOM(&str, fmt, ap));

Given how seldom virVasprintfNOOM (or whatever name we give it) will be
used, it probably doesn't need ATTRIBUTE_RETURN_CHECK.  After all, if
you know you don't care about an error being raised, then the compiler
shouldn't make you care about a successful return value either.

> @@ -327,6 +327,23 @@ virVasprintf(char **strp, const char *fmt, va_list list)
>  }
>  
>  /**
> + * virVasprintf
> + *
> + * like glibc's vasprintf but makes sure *strp == NULL on failure and reports
> + * OOM error.
> + */
> +int
> +virVasprintf(char **strp, const char *fmt, va_list list)
> +{
> +    int ret;
> +
> +    if ((ret = virVasprintfNOOM(strp, fmt, list)) == -1)

s/== -1/< 0/

The idea makes sense, and the choices that you converted over to using
the silent variant look correct, but a v2 might be useful, particularly
after my comments on 2/5 about splitting the series differently.  Anyone
else with a better idea for a name?

-- 
Eric Blake   eblake redhat com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 621 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20130402/dc66219c/attachment-0001.sig>


More information about the libvir-list mailing list