diff options
author | wm4 <wm4@nowhere> | 2012-08-16 16:18:51 +0200 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2012-08-16 17:16:08 +0200 |
commit | 1b7b0c93a875d76573cc44bb0fe92e7bd5a7a366 (patch) | |
tree | 375574bff6d7133076a742bc7501e05574fbe7b2 /libvo | |
parent | 850f2b4511608e4b19f15c645416d962ec5e1af1 (diff) |
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.
Diffstat (limited to 'libvo')
-rw-r--r-- | libvo/video_out.c | 5 |
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; } |