Em Mon, 30 Dec 2013 13:48:34 +0100 André Roth <neolynx@xxxxxxxxx> escreveu: description? What bug are you trying to fix? > Signed-off-by: André Roth <neolynx@xxxxxxxxx> > --- > lib/libdvbv5/dvb-scan.c | 36 +++++++++++++++++++++++------------- > 1 file changed, 23 insertions(+), 13 deletions(-) > > diff --git a/lib/libdvbv5/dvb-scan.c b/lib/libdvbv5/dvb-scan.c > index e9ccc72..520bf9c 100644 > --- a/lib/libdvbv5/dvb-scan.c > +++ b/lib/libdvbv5/dvb-scan.c > @@ -96,9 +96,13 @@ int dvb_read_section_with_id(struct dvb_v5_fe_parms *parms, int dmx_fd, > uint8_t *buf = NULL; > uint8_t *tbl = NULL; > ssize_t table_length = 0; > + > + // handle sections No C99 comments. > + int start_id = -1; > + int start_section = -1; > int first_section = -1; > int last_section = -1; > - int table_id = -1; > + /*int table_id = -1;*/ Why to comment? If it is buggy, just remove it. > int sections = 0; > struct dmx_sct_filter_params f; > struct dvb_table_header *h; > @@ -108,7 +112,6 @@ int dvb_read_section_with_id(struct dvb_v5_fe_parms *parms, int dmx_fd, > *table = NULL; > > // FIXME: verify known table > - > memset(&f, 0, sizeof(f)); > f.pid = pid; > f.filter.filter[0] = tid; > @@ -185,24 +188,27 @@ int dvb_read_section_with_id(struct dvb_v5_fe_parms *parms, int dmx_fd, > > h = (struct dvb_table_header *)buf; > dvb_table_header_init(h); > + > + /* dvb_logdbg( "dvb_read_section: id %d, section %d/%d, current: %d", h->id, h->section_id, h->last_section, h->current_next ); */ > + if (start_id == h->id && start_section == h->section_id) { > + dvb_logdbg( "dvb_read_section: section repeated, reading done" ); > + break; > + } > + if (start_id == -1) start_id = h->id; > + if (start_section == -1) start_section = h->section_id; One statement per line, please. > + > if (id != -1 && h->id != id) { /* search for a specific table id */ > continue; > - } else { > - if (table_id == -1) > - table_id = h->id; > - else if (h->id != table_id) { > - dvb_logwarn("dvb_read_section: table ID mismatch reading multi section table: %d != %d", h->id, table_id); > - continue; > - } > } > > + /*dvb_logerr("dvb_read_section: got section %d, last %d, filter %d", h->section_id, h->last_section, id );*/ Why are you adding a commented line? > /* handle the sections */ > if (first_section == -1) > first_section = h->section_id; > - else if (h->section_id == first_section) > + else if (start_id == h->id && h->section_id == first_section) > break; > > - if (last_section == -1) > + if (last_section == -1 || h->last_section > last_section) > last_section = h->last_section; > > if (!tbl) { > @@ -228,10 +234,14 @@ int dvb_read_section_with_id(struct dvb_v5_fe_parms *parms, int dmx_fd, > else > dvb_logerr("dvb_read_section: no initializer for table %d", tid); > > - if (++sections == last_section + 1) > + if (id != -1 && ++sections == last_section + 1) { > + dvb_logerr("dvb_read_section: ++sections == last_section + 1"); > break; > + } > } > - free(buf); > + > + if (buf) > + free(buf); Buffer is always allocated at this point. No need to test before free. > > dvb_dmx_stop(dmx_fd); > -- Cheers, Mauro -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html