summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2012-08-16 16:18:51 +0200
committerwm4 <wm4@nowhere>2012-08-16 17:16:08 +0200
commit1b7b0c93a875d76573cc44bb0fe92e7bd5a7a366 (patch)
tree375574bff6d7133076a742bc7501e05574fbe7b2
parent850f2b4511608e4b19f15c645416d962ec5e1af1 (diff)
downloadmpv-1b7b0c93a875d76573cc44bb0fe92e7bd5a7a366.tar.bz2
mpv-1b7b0c93a875d76573cc44bb0fe92e7bd5a7a366.tar.xz
video_out: fix crash when VO autoselection fails
init_best_video_out() did not manage the memory for vo->window_title correctly, and free'd it twice when initialization failed (that's due to talloc_free_children() being called). When the next VO was tried, it reused the dangling pointer. Initialize this member somewhere else lazily instead.
-rw-r--r--libvo/video_out.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/libvo/video_out.c b/libvo/video_out.c
index 4066146152..9e65be8aab 100644
--- a/libvo/video_out.c
+++ b/libvo/video_out.c
@@ -306,7 +306,6 @@ struct vo *init_best_video_out(struct MPOpts *opts,
.input_ctx = input_ctx,
.event_fd = -1,
.registered_fd = -1,
- .window_title = talloc_strdup(vo, ""),
};
// first try the preferred drivers, with their optional subdevice param:
if (vo_list && vo_list[0])
@@ -351,7 +350,7 @@ struct vo *init_best_video_out(struct MPOpts *opts,
return vo; // success!
talloc_free_children(vo);
}
- free(vo);
+ talloc_free(vo);
return NULL;
}
@@ -488,6 +487,8 @@ void calc_src_dst_rects(struct vo *vo, int src_width, int src_height,
// you need to keep the string for an extended period of time.
const char *vo_get_window_title(struct vo *vo)
{
+ if (!vo->window_title)
+ vo->window_title = talloc_strdup(vo, "");
return vo->window_title;
}