Message ID | 1388407731-24369-1-git-send-email-neolynx@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Em Mon, 30 Dec 2013 13:48:34 +0100 André Roth <neolynx@gmail.com> escreveu: description? What bug are you trying to fix? > Signed-off-by: André Roth <neolynx@gmail.com> > --- > 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); >
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 + int start_id = -1; + int start_section = -1; int first_section = -1; int last_section = -1; - int table_id = -1; + /*int table_id = -1;*/ 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; + 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 );*/ /* 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); dvb_dmx_stop(dmx_fd);
Signed-off-by: André Roth <neolynx@gmail.com> --- lib/libdvbv5/dvb-scan.c | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-)