[PATCH weston v2] xwm: set the shell_surface's title

Axel Davy davy at clipper.ens.fr
Mon Sep 16 04:27:22 PDT 2013


It crashes in set_title, when called by one of the functions in 
XWayland window manager. Looks like it try to free something it isn't 
allowed to free (maybe is in use?).

I get the crash with firefox after less than 1 minute playing with the 
menus, and with vlc when looking a video and moving the mouse at the 
same time during a few minutes.

If I remove the two calls to set_title in XWayland (removing only one 
doesn't remove the crash), it fixes the crash.

Axel Davy

On Mon, 16 Sep 2013, Giulio Camuffo wrote:

> How does it crash? And when doing what?
> Giulio
> 
> 
> 2013/9/15 Axel Davy <davy at clipper.ens.fr>
>
>       This patch makes XWayland often crash for me.
>
>       Axel Davy
>
>       Le 11/09/2013 18:20, Giulio Camuffo a écrit :
>             add a new function pointer to the
>             weston_shell_interface struct that
>             shells will set accordingly.
>             ---
>               src/compositor.h              |  2 ++
>               src/shell.c                   | 11 +++++++++--
>               src/xwayland/window-manager.c | 11 +++++++++++
>               3 files changed, 22 insertions(+), 2 deletions(-)
>
>             diff --git a/src/compositor.h b/src/compositor.h
>             index 3c1b643..ead0c91 100644
>             --- a/src/compositor.h
>             +++ b/src/compositor.h
>             @@ -107,6 +107,8 @@ struct weston_shell_interface {
>                     int (*move)(struct shell_surface *shsurf,
>             struct weston_seat *ws);
>                     int (*resize)(struct shell_surface *shsurf,
>                                   struct weston_seat *ws,
>             uint32_t edges);
>             +       void (*set_title)(struct shell_surface
>             *shsurf,
>             +                         const char *title);
>
>               };
>
>             diff --git a/src/shell.c b/src/shell.c
>             index dc15bfa..ea4315a 100644
>             --- a/src/shell.c
>             +++ b/src/shell.c
>             @@ -1595,13 +1595,19 @@ shell_surface_pong(struct
>             wl_client *client, struct wl_resource *resource,
>               }
>
>               static void
>             +set_title(struct shell_surface *shsurf, const char
>             *title)
>             +{
>             +       free(shsurf->title);
>             +       shsurf->title = strdup(title);
>             +}
>             +
>             +static void
>               shell_surface_set_title(struct wl_client *client,
>                                     struct wl_resource
>             *resource, const char *title)
>               {
>                     struct shell_surface *shsurf =
>             wl_resource_get_user_data(resource);
>
>             -       free(shsurf->title);
>             -       shsurf->title = strdup(title);
>             +       set_title(shsurf, title);
>               }
>
>               static void
>             @@ -4583,6 +4589,7 @@ module_init(struct
>             weston_compositor *ec,
>                     ec->shell_interface.set_xwayland =
>             set_xwayland;
>                     ec->shell_interface.move = surface_move;
>                     ec->shell_interface.resize = surface_resize;
>             +       ec->shell_interface.set_title = set_title;
>
>                     wl_list_init(&shell->input_panel.surfaces);
>
>             diff --git a/src/xwayland/window-manager.c
>             b/src/xwayland/window-manager.c
>             index f775734..b4f64d3 100644
>             --- a/src/xwayland/window-manager.c
>             +++ b/src/xwayland/window-manager.c
>             @@ -363,6 +363,8 @@ static void
>               weston_wm_window_read_properties(struct
>             weston_wm_window *window)
>               {
>                     struct weston_wm *wm = window->wm;
>             +       struct weston_shell_interface
>             *shell_interface =
>             +              
>             &wm->server->compositor->shell_interface;
>
>               #define F(field) offsetof(struct weston_wm_window,
>             field)
>                     const struct {
>             @@ -468,6 +470,9 @@
>             weston_wm_window_read_properties(struct
>             weston_wm_window *window)
>                             }
>                             free(reply);
>                     }
>             +
>             +       if (window->shsurf && window->name)
>             +              
>             shell_interface->set_title(window->shsurf,
>             window->name);
>               }
>
>               static void
>             @@ -1875,6 +1880,9 @@ surface_destroy(struct
>             wl_listener *listener, void *data)
>
>                     wm_log("surface for xid %d destroyed\n",
>             window->id);
>
>             +       /* This should have been freed by the shell.
>             +       Don't try to use it later. */
>             +       window->shsurf = NULL;
>                     window->surface = NULL;
>               }
>
>             @@ -2029,6 +2037,9 @@
>             xserver_map_shell_surface(struct weston_wm *wm,
>                                                                
>               window->surface,
>                                                                
>               &shell_client);
>
>             +       if (window->name)
>             +              
>             shell_interface->set_title(window->shsurf,
>             window->name);
>             +
>                     if (window->fullscreen) {
>                             window->saved_width = window->width;
>                             window->saved_height =
>             window->height;
> 
> 
> 
> 
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
> 
> 
> 
>


More information about the wayland-devel mailing list