[Libguestfs] [PATCH] lib/errors.c: Fix usage of strerror_r

Masayoshi Mizuma msys.mizuma at gmail.com
Wed Dec 8 23:26:07 UTC 2021


On Wed, Dec 08, 2021 at 05:06:24PM +0000, Richard W.M. Jones wrote:
>   $ ./run guestfish -vx add-drive foo "readonly:true"
>   libguestfs: trace: set_pgroup true
>   libguestfs: trace: set_pgroup = 0
>   libguestfs: trace: add_drive "foo" "readonly:true"
>   libguestfs: error: foo:
>   libguestfs: trace: add_drive = -1 (error)
>   libguestfs: trace: close
>   libguestfs: closing guestfs handle 0x55c0bacf12a0 (state 0)
> 
> Note the "error: foo: " line.  After hexdumping this I found that it
> is actually printing random rubbish after the colon.  It turns out
> that strerror_r was not updating the buffer and so we were printing
> random bytes from the stack.
> 
> strerror_r is hard to use and worse still there are two incompatible
> variants in glibc.  Close reading of the GNU variant that we are using
> shows that it doesn't always use the buffer passed in, which explains
> what was happening here.
> 
> Try to fix usage of strerror_r and try to cope with the two variants
> using _GNU_SOURCE.
> 
> Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=2030396

Thank you for this patch. It works well!

  $ ./run guestfish -vx add-drive foo "readonly:true"
  libguestfs: trace: set_pgroup true
  libguestfs: trace: set_pgroup = 0
  libguestfs: trace: add_drive "foo" "readonly:true"
  libguestfs: error: foo: No such file or directory
  libguestfs: trace: add_drive = -1 (error)
  libguestfs: trace: close
  libguestfs: closing guestfs handle 0x103c130 (state 0)
  $

Please feel free to add:

Tested-by: Masayoshi Mizuma <m.mizuma at jp.fujitsu.com>

Thanks!
Masa

> ---
>  lib/errors.c | 15 ++++++++++++---
>  1 file changed, 12 insertions(+), 3 deletions(-)
> 
> diff --git a/lib/errors.c b/lib/errors.c
> index bd9699eeb1..d599a21879 100644
> --- a/lib/errors.c
> +++ b/lib/errors.c
> @@ -322,6 +322,7 @@ guestfs_int_perrorf (guestfs_h *g, const char *fs, ...)
>    const int errnum = errno;
>    int err;
>    char buf[256];
> +  const char *errstr;
>    struct error_data *error_data = get_error_data (g);
>  
>    va_start (args, fs);
> @@ -330,11 +331,19 @@ guestfs_int_perrorf (guestfs_h *g, const char *fs, ...)
>  
>    if (err < 0) return;
>  
> -  ignore_value (strerror_r (errnum, buf, sizeof buf));
> +#ifdef _GNU_SOURCE
> +  /* GNU strerror_r */
> +  errstr = strerror_r (errnum, buf, sizeof buf);
> +#else
> +  /* XSI-compliant strerror_r */
> +  err = strerror_r (errnum, buf, sizeof buf);
> +  if (err > 0) return;
> +  errstr = buf;
> +#endif
>  
> -  msg = safe_realloc (g, msg, strlen (msg) + 2 + strlen (buf) + 1);
> +  msg = safe_realloc (g, msg, strlen (msg) + 2 + strlen (errstr) + 1);
>    strcat (msg, ": ");
> -  strcat (msg, buf);
> +  strcat (msg, errstr);
>  
>    /* set_last_error first so that the callback can access the error
>     * message and errno through the handle if it wishes.
> -- 
> 2.32.0




More information about the Libguestfs mailing list