[libvirt] [PATCH] Fixes for VNC port handling

Daniel P. Berrange berrange at redhat.com
Wed Jan 28 11:29:16 UTC 2009


On Tue, Jan 27, 2009 at 09:23:42PM -0800, john.levon at sun.com wrote:
> Fixes for VNC port handling
> 
> When parsing sexpr, the VNC port should not be ignored, even when vncunused is
> set. Fix the parsing of vncdisplay, which was broken due to strtol() (never
> use this function!).
> 
> Signed-off-by: John Levon <john.levon at sun.com>
> 
> diff --git a/src/xend_internal.c b/src/xend_internal.c
> --- a/src/xend_internal.c
> +++ b/src/xend_internal.c
> @@ -612,7 +612,9 @@ sexpr_get(virConnectPtr xend, const char
>   *
>   * convenience function to lookup an int value in the S-Expression
>   *
> - * Returns the value found or 0 if not found (but may not be an error)
> + * Returns the value found or 0 if not found (but may not be an error).
> + * This function suffers from the flaw that zero is both a correct
> + * return value and an error indicator: careful!
>   */
>  static int
>  sexpr_int(const struct sexpr *sexpr, const char *name)
> @@ -2091,15 +2093,16 @@ xenDaemonParseSxprGraphicsNew(virConnect
>                  port = xenStoreDomainGetVNCPort(conn, def->id);
>                  xenUnifiedUnlock(priv);
>  
> +                // Didn't find port entry in xenstore
>                  if (port == -1) {
> -                    // Didn't find port entry in xenstore
> -                    port = sexpr_int(node, "device/vfb/vncdisplay");
> +                    const char *value = sexpr_node(node,
> +                        "device/vfb/vncdisplay");
> +                    if (value != NULL)
> +                        port = strtol(value, NULL, 0);

This isn't checking the return value of strtol, so it could have
parsed garbage from XenD's SEXPR. Prefer to use virStrToLong_i()
and initialize port back to -1 upon failure.

>  
> -                if ((unused && STREQ(unused, "1")) || port == -1) {
> +                if ((unused && STREQ(unused, "1")) || port == -1)
>                      graphics->data.vnc.autoport = 1;
> -                    port = -1;
> -                }
>  
>                  if (port >= 0 && port < 5900)
>                      port += 5900;

The general idea of the patch seems correct. A question about
the test case though - the code above is dealing with correctly
handling the 'device/vfb/vncdisplay'  field in the SEXPR, but
your test SEXPR data doesn't have a 'vncdisplay' field:

> +    (device
> +        (vfb
> +            (vncunused 1)
> +            (keymap en-us)
> +            (type vnc)
> +            (uuid 09666ad1-0c94-d79c-1439-99e05394ee51)
> +            (location localhost:5900)
> +        )
> +    )

And I've not seen this 'location' field before - guess that's
something new in XenD we've not handled before.

Daniel
-- 
|: Red Hat, Engineering, London   -o-   http://people.redhat.com/berrange/ :|
|: http://libvirt.org  -o-  http://virt-manager.org  -o-  http://ovirt.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505  -o-  F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|




More information about the libvir-list mailing list