diff options
author | Pekka Paalanen <pekka.paalanen@collabora.co.uk> | 2016-04-28 15:12:25 +0300 |
---|---|---|
committer | Pekka Paalanen <pekka.paalanen@collabora.co.uk> | 2016-04-29 14:14:47 +0300 |
commit | e5b5659240e1c1c23bf74c0b126de982747dffa7 (patch) | |
tree | 9546a5ad89b4f59aa24ed1d28daf9773aa0ac926 | |
parent | c06389a105995622841b640c56b252286ac1143c (diff) |
compositor-fbdev: make copy of the device string
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>
-rw-r--r-- | src/compositor-fbdev.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/src/compositor-fbdev.c b/src/compositor-fbdev.c index 19c5e3b8..e2f978b9 100644 --- a/src/compositor-fbdev.c +++ b/src/compositor-fbdev.c @@ -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; } |