From e5b5659240e1c1c23bf74c0b126de982747dffa7 Mon Sep 17 00:00:00 2001 From: Pekka Paalanen Date: Thu, 28 Apr 2016 15:12:25 +0300 Subject: [PATCH] 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 Reviewed-by: Quentin Glidic Reviewed-by: Benoit Gschwind --- src/compositor-fbdev.c | 13 ++++++++----- 1 file 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; }