int desc_type = ptr[0];
int desc_len = ptr[1];
size_t size;
+
dvb_desc_init_func init = dvb_descriptors[desc_type].init;
if (!init) {
init = dvb_desc_default_init;
dvb_logerr("descriptor type %d has no size defined", current->type);
size = 4096;
}
- current = (struct dvb_desc *) malloc(size);
+ current = malloc(size);
+ if (!current)
+ dvb_perror("Out of memory");
ptr += dvb_desc_init(ptr, current); /* the standard header was read */
+ if (ptr >= buf + section_length) {
+ dvb_logerr("descriptor is truncated");
+ return;
+ }
init(parms, ptr, current);
if(!*head_desc)
*head_desc = current;
desc_length = t->desc_length;
} else {
- memcpy(table, p, sizeof(struct dvb_table_nit) - sizeof(nit->descriptor) - sizeof(nit->transport));
+ if (buflen < offsetof(struct dvb_table_nit, descriptor)) {
+ dvb_logerr("NIT table was truncated");
+ return;
+ }
+ memcpy(table, p, offsetof(struct dvb_table_nit, descriptor));
*table_length = sizeof(struct dvb_table_nit);
bswap16(nit->bitfield);
head = &nit->transport;
desc_length = nit->desc_length;
}
- p += sizeof(struct dvb_table_nit) - sizeof(nit->descriptor) - sizeof(nit->transport);
-
+ p += offsetof(struct dvb_table_nit, descriptor);
+ if (buflen - (p - buf) < desc_length) {
+ dvb_logerr("NIT table was truncated");
+ return;
+ }
dvb_parse_descriptors(parms, p, desc_length, head_desc);
p += desc_length;
struct dvb_table_nit_transport *last = NULL;
while ((uint8_t *) p < buf + buflen - 4) {
- struct dvb_table_nit_transport *transport = (struct dvb_table_nit_transport *) malloc(sizeof(struct dvb_table_nit_transport));
- memcpy(transport, p, sizeof(struct dvb_table_nit_transport) - sizeof(transport->descriptor) - sizeof(transport->next));
- p += sizeof(struct dvb_table_nit_transport) - sizeof(transport->descriptor) - sizeof(transport->next);
+ struct dvb_table_nit_transport *transport = malloc(sizeof(struct dvb_table_nit_transport));
+ if (!transport)
+ dvb_perror("Out of memory");
+ memcpy(transport, p, offsetof(struct dvb_table_nit_transport, descriptor));
+ p += offsetof(struct dvb_table_nit_transport, descriptor);
bswap16(transport->transport_id);
bswap16(transport->network_id);