To avoid memory corruption or leak I store a copy of the device file
name in the fbdev-backend structure.

Signed-off-by: Benoit Gschwind <[email protected]>
---
 src/compositor-fbdev.c | 17 +++++++++--------
 1 file changed, 9 insertions(+), 8 deletions(-)

diff --git a/src/compositor-fbdev.c b/src/compositor-fbdev.c
index d0597a6..619f969 100644
--- a/src/compositor-fbdev.c
+++ b/src/compositor-fbdev.c
@@ -59,6 +59,7 @@ struct fbdev_backend {
        struct udev *udev;
        struct udev_input input;
        int use_pixman;
+       char *device;
        struct wl_listener session_listener;
 };
 
@@ -448,8 +449,7 @@ static void fbdev_output_destroy(struct weston_output 
*base);
 static void fbdev_output_disable(struct weston_output *base);
 
 static int
-fbdev_output_create(struct fbdev_backend *backend,
-                    const char *device)
+fbdev_output_create(struct fbdev_backend *backend)
 {
        struct fbdev_output *output;
        struct weston_config_section *section;
@@ -465,10 +465,11 @@ fbdev_output_create(struct fbdev_backend *backend,
                return -1;
 
        output->backend = backend;
-       output->device = device;
+       output->device = backend->device;
 
        /* Create the frame buffer. */
-       fb_fd = fbdev_frame_buffer_open(output, device, &output->fb_info);
+       fb_fd = fbdev_frame_buffer_open(output, backend->device,
+                                       &output->fb_info);
        if (fb_fd < 0) {
                weston_log("Creating frame buffer failed.\n");
                goto out_free;
@@ -602,7 +603,6 @@ fbdev_output_reenable(struct fbdev_backend *backend,
        struct fbdev_output *output = to_fbdev_output(base);
        struct fbdev_screeninfo new_screen_info;
        int fb_fd;
-       const char *device;
 
        weston_log("Re-enabling fbdev output.\n");
 
@@ -629,9 +629,8 @@ fbdev_output_reenable(struct fbdev_backend *backend,
                /* Remove and re-add the output so that resources depending on
                 * the frame buffer X/Y resolution (such as the shadow buffer)
                 * are re-initialised. */
-               device = output->device;
                fbdev_output_destroy(base);
-               fbdev_output_create(backend, device);
+               fbdev_output_create(backend);
 
                return 0;
        }
@@ -684,6 +683,7 @@ fbdev_backend_destroy(struct weston_compositor *base)
        /* Chain up. */
        weston_launcher_destroy(base->launcher);
 
+       free(backend->device);
        free(backend);
 }
 
@@ -778,6 +778,7 @@ fbdev_backend_create(struct weston_compositor *compositor, 
int *argc, char *argv
 
        backend->prev_state = WESTON_COMPOSITOR_ACTIVE;
        backend->use_pixman = !param->use_gl;
+       backend->device = strdup(param->device);
 
        weston_setup_vt_switch_bindings(compositor);
 
@@ -801,7 +802,7 @@ fbdev_backend_create(struct weston_compositor *compositor, 
int *argc, char *argv
                }
        }
 
-       if (fbdev_output_create(backend, param->device) < 0)
+       if (fbdev_output_create(backend) < 0)
                goto out_launcher;
 
        udev_input_init(&backend->input, compositor, backend->udev, seat_id);
-- 
2.7.3

_______________________________________________
wayland-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to