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 <d...@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@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel



_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to