dvbpsi.c: fix bug in dvbpsi_decoder_psi_section_add()
[email protected] (Jean-Paul Saman)
| Newsgroups | gmane.comp.video.videolan.libdvbpsi.devel |
|---|---|
| Message-ID | <[email protected]> |
libdvbpsi | branch: master | Jean-Paul Saman <[email protected]> | Wed Aug 15 16:07:55 2012 +0200| [5c3b697f4fc14b92e34b858abcf69378284bee3f] | committer: Jean-Paul Saman dvbpsi.c: fix bug in dvbpsi_decoder_psi_section_add() Inserting a new PSI section did not take into account that the previous pointer could be none existing. It was equal to the start of the list, which resulted in a loop. (Fixes commit: 57c6cd6360106fe6ca9738d2fc52a2a87ad276cb) > http://git.videolan.org/gitweb.cgi/libdvbpsi.git/?a=commit;h=5c3b697f4fc14b92e34b858abcf69378284bee3f --- src/dvbpsi.c | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/src/dvbpsi.c b/src/dvbpsi.c index e07623e..e4aa4ae 100644 --- a/src/dvbpsi.c +++ b/src/dvbpsi.c @@ -238,16 +238,19 @@ bool dvbpsi_decoder_psi_section_add(dvbpsi_decoder_t *p_decoder, dvbpsi_psi_sect { assert(p_decoder); assert(p_section); + assert(p_section->p_next == NULL); + /* Empty list */ if (!p_decoder->p_sections) { p_decoder->p_sections = p_section; + p_section->p_next = NULL; return false; } /* Insert in right place */ dvbpsi_psi_section_t *p = p_decoder->p_sections; - dvbpsi_psi_section_t *p_prev = p; + dvbpsi_psi_section_t *p_prev = NULL; bool b_overwrite = false; while (p) @@ -260,14 +263,22 @@ bool dvbpsi_decoder_psi_section_add(dvbpsi_decoder_t *p_decoder, dvbpsi_psi_sect p->p_next = NULL; dvbpsi_DeletePSISections(p); b_overwrite = true; - break; + goto out; } else if (p->i_number > p_section->i_number) { - /* Insert */ - p_prev->p_next = p_section; - p_section->p_next = p; - break; + /* Insert before p */ + if (p_prev) + { + p_prev->p_next = p_section; + p_section->p_next = p; + } + else + { + p_section->p_next = p; + p_decoder->p_sections = p_section; + } + goto out; } p_prev = p; @@ -278,8 +289,10 @@ bool dvbpsi_decoder_psi_section_add(dvbpsi_decoder_t *p_decoder, dvbpsi_psi_sect if (p_prev->i_number < p_section->i_number) { p_prev->p_next = p_section; + p_section->p_next = NULL; } +out: return b_overwrite; } _______________________________________________ libdvbpsi-devel mailing list [email protected] http://mailman.videolan.org/listinfo/libdvbpsi-devel