[Spice-devel] [PATCH spice-gtk 6/9] session: parse spice+unix:// URI

Christophe Fergeau cfergeau at redhat.com
Tue Jan 27 02:09:50 PST 2015


Hey,

On Tue, Jan 13, 2015 at 05:38:25PM +0100, Marc-André Lureau wrote:
> ---
>  gtk/spice-session.c | 12 +++++++++++-
>  1 file changed, 11 insertions(+), 1 deletion(-)
> 
> diff --git a/gtk/spice-session.c b/gtk/spice-session.c
> index 6f04a1a..ecc9e86 100644
> --- a/gtk/spice-session.c
> +++ b/gtk/spice-session.c
> @@ -349,6 +349,7 @@ spice_session_finalize(GObject *gobject)
>  }
>  
>  #define URI_SCHEME_SPICE "spice://"
> +#define URI_SCHEME_SPICE_UNIX "spice+unix://"
>  #define URI_QUERY_START ";?"
>  #define URI_QUERY_SEP   ";&"
>  
> @@ -383,10 +384,15 @@ static int spice_parse_uri(SpiceSession *session, const char *original_uri)
>  
>      uri = g_strdup(original_uri);
>  
> +    if (g_str_has_prefix(uri, URI_SCHEME_SPICE_UNIX)) {
> +        path = g_strdup(uri + strlen(URI_SCHEME_SPICE_UNIX));
> +        goto end;
> +    }
> +
>      /* Break up the URI into its various parts, scheme, authority,
>       * path (ignored) and query
>       */
> -    if (strncmp(uri, URI_SCHEME_SPICE, strlen(URI_SCHEME_SPICE)) != 0) {
> +    if (!g_str_has_prefix(uri, URI_SCHEME_SPICE)) {
>          g_warning("Expected a URI scheme of '%s' in URI '%s'",
>                    URI_SCHEME_SPICE, uri);
>          goto fail;
> @@ -489,14 +495,17 @@ static int spice_parse_uri(SpiceSession *session, const char *original_uri)
>          goto fail;
>      }
>  
> +end:
>      /* parsed ok -> apply */
>      g_free(uri);
>      g_free(unescaped_path);
> +    g_free(s->unix_path);
>      g_free(s->host);
>      g_free(s->port);
>      g_free(s->tls_port);
>      g_free(s->username);
>      g_free(s->password);
> +    s->unix_path = path;

If you reuse 'path', spicy --uri spice://foo/bar/baz?port=5900 will
cause s->unix_path to be set (and since in this case, 'path' is not a
malloc'ed string, this will crash sooner or later when you try to free
s->unix_path). Looks good otherwise.

>      s->host = host;
>      s->port = port;
>      s->tls_port = tls_port;
> @@ -507,6 +516,7 @@ static int spice_parse_uri(SpiceSession *session, const char *original_uri)
>  fail:
>      g_free(uri);
>      g_free(unescaped_path);
> +    g_free(path);

'path' must not be freed when it's set by :

if (path && !(g_str_equal(path, "") || g_str_equal(path, "/"))) {
    g_warning("Unexpected path data '%s' for URI '%s'", path, uri);
    /* don't fail, just ignore */

Christophe
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/spice-devel/attachments/20150127/c4559904/attachment.sig>


More information about the Spice-devel mailing list