qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] qga: Use gethostname() instead of g_get_host_name()


From: Philippe Mathieu-Daudé
Subject: Re: [PATCH] qga: Use gethostname() instead of g_get_host_name()
Date: Mon, 22 Jun 2020 12:14:57 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.5.0

Hi Michal,

On 6/16/20 10:34 AM, Michal Privoznik wrote:
> Problem with g_get_host_name() is that on the first call it saves
> the hostname into a global variable and from then on, every
> subsequent call returns the saved hostname. Even if the hostname
> changes. This doesn't play nicely with guest agent, because if
> the hostname is acquired before the guest is set up (e.g. on the
> first boot, or before DHCP) we will report old, invalid hostname.
> 
> Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1845127
> 
> Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
> ---
>  qga/commands.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++----
>  1 file changed, 52 insertions(+), 4 deletions(-)
> 
> diff --git a/qga/commands.c b/qga/commands.c
> index efc8b90281..ce3c2041a6 100644
> --- a/qga/commands.c
> +++ b/qga/commands.c
> @@ -512,14 +512,62 @@ int ga_parse_whence(GuestFileWhence *whence, Error 
> **errp)
>      return -1;
>  }
>  
> +#ifndef HOST_NAME_MAX
> +# ifdef _POSIX_HOST_NAME_MAX
> +#  define HOST_NAME_MAX _POSIX_HOST_NAME_MAX
> +# else
> +#  define HOST_NAME_MAX 255
> +# endif
> +#endif
> +
>  GuestHostName *qmp_guest_get_host_name(Error **errp)
>  {
>      GuestHostName *result = NULL;
> -    gchar const *hostname = g_get_host_name();
> -    if (hostname != NULL) {
> -        result = g_new0(GuestHostName, 1);
> -        result->host_name = g_strdup(hostname);
> +    g_autofree char *hostname = NULL;
> +
> +    /*
> +     * We want to avoid using g_get_host_name() because that
> +     * caches the result and we wouldn't reflect changes in the
> +     * host name.
> +     */

I see there is only one g_get_host_name() call in the
codebase, but can we have a generic qemu_get_host_name()
helper implemented in util/oslib-*c instead?

> +
> +#ifndef G_OS_WIN32
> +    long len = -1;
> +
> +#ifdef _SC_HOST_NAME_MAX
> +    len = sysconf(_SC_HOST_NAME_MAX);
> +#endif /* _SC_HOST_NAME_MAX */
> +
> +    if (len < 0) {
> +        len = HOST_NAME_MAX;
>      }
> +
> +    hostname = g_malloc0(len + 1);
> +
> +    if (gethostname(hostname, len) < 0) {
> +        return NULL;
> +    }
> +
> +#else /* G_OS_WIN32 */
> +
> +    wchar_t tmp[MAX_COMPUTERNAME_LENGTH + 1];
> +    DWORD size = G_N_ELEMENTS(tmp);
> +
> +    if (GetComputerNameW(tmp, &size) != 0) {
> +        /*
> +         * Indeed, on Windows retval of zero means failure
> +         * and nonzero means success.
> +         */
> +        hostname = g_utf16_to_utf8(tmp, size, NULL, NULL, NULL);
> +    }
> +#endif /* G_OS_WIN32 */
> +
> +    if (!hostname) {
> +        hostname = g_strdup("localhost");
> +    }
> +
> +    result = g_new0(GuestHostName, 1);
> +    result->host_name = g_steal_pointer(&hostname);
>      return result;
>  }
>  
> 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]