compositor-fbdev: make copy of the device string
authorPekka Paalanen <pekka.paalanen@collabora.co.uk>
Thu, 28 Apr 2016 12:12:25 +0000 (15:12 +0300)
committerPekka Paalanen <pekka.paalanen@collabora.co.uk>
Fri, 29 Apr 2016 11:14:47 +0000 (14:14 +0300)
Ensuring that the pointer to the device path stays valid gets harder and
harder with migrating to the libweston-style config handling. Therefore,
make a copy of the string, private to struct fbdev_output.

Now the pointer passed in to fbdev_output_create() could be freed right
after the call returns.

Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
Reviewed-by: Quentin Glidic <sardemff7+git@sardemff7.net>
Reviewed-by: Benoit Gschwind <gschwind@gnu-log.net>
src/compositor-fbdev.c

index 19c5e3b8c972c9bd5c9319ed45bacfabc14807f9..e2f978b9901e21306fd456ee7195704f82452ddf 100644 (file)
@@ -84,7 +84,7 @@ struct fbdev_output {
        struct wl_event_source *finish_frame_timer;
 
        /* Frame buffer details. */
-       const char *device; /* ownership shared with fbdev_parameters */
+       char *device;
        struct fbdev_screeninfo fb_info;
        void *fb; /* length is fb_info.buffer_length */
 
@@ -470,7 +470,7 @@ fbdev_output_create(struct fbdev_backend *backend,
                return -1;
 
        output->backend = backend;
-       output->device = device;
+       output->device = strdup(device);
 
        /* Create the frame buffer. */
        fb_fd = fbdev_frame_buffer_open(output, device, &output->fb_info);
@@ -554,6 +554,7 @@ out_hw_surface:
        weston_output_destroy(&output->base);
        fbdev_frame_buffer_destroy(output);
 out_free:
+       free(output->device);
        free(output);
 
        return -1;
@@ -580,6 +581,7 @@ fbdev_output_destroy(struct weston_output *base)
        /* Remove the output. */
        weston_output_destroy(&output->base);
 
+       free(output->device);
        free(output);
 }
 
@@ -607,7 +609,7 @@ 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;
+       char *device;
 
        weston_log("Re-enabling fbdev output.\n");
 
@@ -634,9 +636,10 @@ 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);
+               device = strdup(output->device);
+               fbdev_output_destroy(&output->base);
                fbdev_output_create(backend, device);
+               free(device);
 
                return 0;
        }