libbluray | branch: master | hpi1 <[email protected]> | Sun Aug 21 13:12:28 2016 +0300| [836e64bec70bde0e75cfe4b37613c92b4aa4ba89] | committer: hpi1
_fill_title_info: check allocs > http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=836e64bec70bde0e75cfe4b37613c92b4aa4ba89 --- src/libbluray/bluray.c | 61 +++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 48 insertions(+), 13 deletions(-) diff --git a/src/libbluray/bluray.c b/src/libbluray/bluray.c index 10e4d76..8d8b581 100644 --- a/src/libbluray/bluray.c +++ b/src/libbluray/bluray.c @@ -2589,10 +2589,19 @@ int bd_get_main_title(BLURAY *bd) return bd->title_list->main_title_idx; } -static void _copy_streams(NAV_CLIP *clip, BLURAY_STREAM_INFO *streams, MPLS_STREAM *si, int count) +static int _copy_streams(NAV_CLIP *clip, BLURAY_STREAM_INFO **pstreams, MPLS_STREAM *si, int count) { + BLURAY_STREAM_INFO *streams; int ii; + if (!count) { + return 1; + } + streams = *pstreams = calloc(count, sizeof(BLURAY_STREAM_INFO)); + if (!streams) { + return 0; + } + for (ii = 0; ii < count; ii++) { streams[ii].coding_type = si[ii].coding_type; streams[ii].format = si[ii].format; @@ -2606,6 +2615,8 @@ static void _copy_streams(NAV_CLIP *clip, BLURAY_STREAM_INFO *streams, MPLS_STRE else streams[ii].subpath_id = -1; } + + return 1; } static BLURAY_TITLE_INFO* _fill_title_info(NAV_TITLE* title, uint32_t title_idx, uint32_t playlist) @@ -2614,12 +2625,19 @@ static BLURAY_TITLE_INFO* _fill_title_info(NAV_TITLE* title, uint32_t title_idx, unsigned int ii; title_info = calloc(1, sizeof(BLURAY_TITLE_INFO)); + if (!title_info) { + goto error; + } title_info->idx = title_idx; title_info->playlist = playlist; title_info->duration = (uint64_t)title->duration * 2; title_info->angle_count = title->angle_count; title_info->chapter_count = title->chap_list.count; + if (title_info->chapter_count) { title_info->chapters = calloc(title_info->chapter_count, sizeof(BLURAY_TITLE_CHAPTER)); + if (!title_info->chapters) { + goto error; + } for (ii = 0; ii < title_info->chapter_count; ii++) { title_info->chapters[ii].idx = ii; title_info->chapters[ii].start = (uint64_t)title->chap_list.mark[ii].title_time * 2; @@ -2627,8 +2645,13 @@ static BLURAY_TITLE_INFO* _fill_title_info(NAV_TITLE* title, uint32_t title_idx, title_info->chapters[ii].offset = (uint64_t)title->chap_list.mark[ii].title_pkt * 192L; title_info->chapters[ii].clip_ref = title->chap_list.mark[ii].clip_ref; } + } title_info->mark_count = title->mark_list.count; + if (title_info->mark_count) { title_info->marks = calloc(title_info->mark_count, sizeof(BLURAY_TITLE_MARK)); + if (!title_info->marks) { + goto error; + } for (ii = 0; ii < title_info->mark_count; ii++) { title_info->marks[ii].idx = ii; title_info->marks[ii].type = title->mark_list.mark[ii].mark_type; @@ -2637,8 +2660,13 @@ static BLURAY_TITLE_INFO* _fill_title_info(NAV_TITLE* title, uint32_t title_idx, title_info->marks[ii].offset = (uint64_t)title->mark_list.mark[ii].title_pkt * 192L; title_info->marks[ii].clip_ref = title->mark_list.mark[ii].clip_ref; } + } title_info->clip_count = title->clip_list.count; + if (title_info->clip_count) { title_info->clips = calloc(title_info->clip_count, sizeof(BLURAY_CLIP_INFO)); + if (!title_info->clips) { + goto error; + } for (ii = 0; ii < title_info->clip_count; ii++) { MPLS_PI *pi = &title->pl->play_item[ii]; BLURAY_CLIP_INFO *ci = &title_info->clips[ii]; @@ -2656,21 +2684,24 @@ static BLURAY_TITLE_INFO* _fill_title_info(NAV_TITLE* title, uint32_t title_idx, ci->ig_stream_count = pi->stn.num_ig; ci->sec_video_stream_count = pi->stn.num_secondary_video; ci->sec_audio_stream_count = pi->stn.num_secondary_audio; - ci->video_streams = calloc(ci->video_stream_count, sizeof(BLURAY_STREAM_INFO)); - ci->audio_streams = calloc(ci->audio_stream_count, sizeof(BLURAY_STREAM_INFO)); - ci->pg_streams = calloc(ci->pg_stream_count, sizeof(BLURAY_STREAM_INFO)); - ci->ig_streams = calloc(ci->ig_stream_count, sizeof(BLURAY_STREAM_INFO)); - ci->sec_video_streams = calloc(ci->sec_video_stream_count, sizeof(BLURAY_STREAM_INFO)); - ci->sec_audio_streams = calloc(ci->sec_audio_stream_count, sizeof(BLURAY_STREAM_INFO)); - _copy_streams(nc, ci->video_streams, pi->stn.video, ci->video_stream_count); - _copy_streams(nc, ci->audio_streams, pi->stn.audio, ci->audio_stream_count); - _copy_streams(nc, ci->pg_streams, pi->stn.pg, ci->pg_stream_count); - _copy_streams(nc, ci->ig_streams, pi->stn.ig, ci->ig_stream_count); - _copy_streams(nc, ci->sec_video_streams, pi->stn.secondary_video, ci->sec_video_stream_count); - _copy_streams(nc, ci->sec_audio_streams, pi->stn.secondary_audio, ci->sec_audio_stream_count); + if (!_copy_streams(nc, &ci->video_streams, pi->stn.video, ci->video_stream_count) || + !_copy_streams(nc, &ci->audio_streams, pi->stn.audio, ci->audio_stream_count) || + !_copy_streams(nc, &ci->pg_streams, pi->stn.pg, ci->pg_stream_count) || + !_copy_streams(nc, &ci->ig_streams, pi->stn.ig, ci->ig_stream_count) || + !_copy_streams(nc, &ci->sec_video_streams, pi->stn.secondary_video, ci->sec_video_stream_count) || + !_copy_streams(nc, &ci->sec_audio_streams, pi->stn.secondary_audio, ci->sec_audio_stream_count)) { + + goto error; + } + } } return title_info; + + error: + BD_DEBUG(DBG_CRIT, "Out of memory\n"); + bd_free_title_info(title_info); + return NULL; } static BLURAY_TITLE_INFO *_get_title_info(BLURAY *bd, uint32_t title_idx, uint32_t playlist, const char *mpls_name, @@ -2729,8 +2760,10 @@ void bd_free_title_info(BLURAY_TITLE_INFO *title_info) { unsigned int ii; + if (title_info) { X_FREE(title_info->chapters); X_FREE(title_info->marks); + if (title_info->clips) { for (ii = 0; ii < title_info->clip_count; ii++) { X_FREE(title_info->clips[ii].video_streams); X_FREE(title_info->clips[ii].audio_streams); @@ -2740,7 +2773,9 @@ void bd_free_title_info(BLURAY_TITLE_INFO *title_info) X_FREE(title_info->clips[ii].sec_audio_streams); } X_FREE(title_info->clips); + } X_FREE(title_info); + } } /* _______________________________________________ libbluray-devel mailing list [email protected] https://mailman.videolan.org/listinfo/libbluray-devel
