From bc58f5b76c3235c17b80bf6919b947e4d2b83716 Mon Sep 17 00:00:00 2001 From: Mauro Carvalho Chehab Date: Wed, 27 Nov 2013 19:11:33 -0200 Subject: [PATCH] libdvbv5: fix extension descriptor handler There are several issues at the extension handler: 1) the size is wrong, as it is getting data from descriptors.c, instead of from the extensions; 2) there are memory leaks; 3) It doesn't print the extension descriptors. Fix them. Signed-off-by: Mauro Carvalho Chehab --- lib/include/descriptors/desc_extension.h | 2 ++ lib/libdvbv5/descriptors.c | 2 +- lib/libdvbv5/descriptors/desc_extension.c | 36 ++++++++++++++++++++++++------- 3 files changed, 31 insertions(+), 9 deletions(-) diff --git a/lib/include/descriptors/desc_extension.h b/lib/include/descriptors/desc_extension.h index 2dd951f..5921cba 100644 --- a/lib/include/descriptors/desc_extension.h +++ b/lib/include/descriptors/desc_extension.h @@ -76,6 +76,8 @@ extern "C" { void extension_descriptor_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc); void extension_descriptor_free(struct dvb_desc *descriptor); +void extension_descriptor_print(struct dvb_v5_fe_parms *parms, + const struct dvb_desc *desc); #ifdef __cplusplus } diff --git a/lib/libdvbv5/descriptors.c b/lib/libdvbv5/descriptors.c index e8c32ed..d12119f 100644 --- a/lib/libdvbv5/descriptors.c +++ b/lib/libdvbv5/descriptors.c @@ -871,7 +871,7 @@ const struct dvb_descriptor dvb_descriptors[] = { [extension_descriptor] = { .name = "extension_descriptor", .init = extension_descriptor_init, - .print = NULL, + .print = extension_descriptor_print, .free = extension_descriptor_free, .size = sizeof(struct dvb_extension_descriptor), }, diff --git a/lib/libdvbv5/descriptors/desc_extension.c b/lib/libdvbv5/descriptors/desc_extension.c index 8eac4b5..63715aa 100644 --- a/lib/libdvbv5/descriptors/desc_extension.c +++ b/lib/libdvbv5/descriptors/desc_extension.c @@ -120,7 +120,7 @@ const struct dvb_ext_descriptor dvb_ext_descriptors[] = { void extension_descriptor_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc) { - struct dvb_extension_descriptor *ext = (struct dvb_extension_descriptor *)desc; + struct dvb_extension_descriptor *ext = (void *)desc; unsigned char *p = (unsigned char *)buf; unsigned desc_type = *p; size_t size = 0; @@ -139,7 +139,7 @@ void extension_descriptor_init(struct dvb_v5_fe_parms *parms, break; /* fall through */ case 3: - dvb_log("%sextension descriptor %s type 0x%x, size %d", + dvb_log("%sextension descriptor %s type 0x%02x, size %d", dvb_ext_descriptors[desc_type].init ? "" : "Not handled ", dvb_ext_descriptors[desc_type].name, desc_type, desc_len); hexdump(parms, "content: ", p, desc_len); @@ -147,20 +147,40 @@ void extension_descriptor_init(struct dvb_v5_fe_parms *parms, init = dvb_ext_descriptors[desc_type].init; if (init) - size = dvb_descriptors[desc_type].size; + size = dvb_ext_descriptors[desc_type].size; if (!size) size = desc_len; - ext->descriptor = malloc(size); - memcpy(ext->descriptor, p, size); + ext->descriptor = calloc(1, size); + if (init) init(parms, p, ext, ext->descriptor); + else + memcpy(ext->descriptor, p, size); } void extension_descriptor_free(struct dvb_desc *descriptor) { - struct dvb_extension_descriptor *ext = (struct dvb_extension_descriptor *)descriptor; + struct dvb_extension_descriptor *ext = (void *)descriptor; + uint8_t type = ext->extension_code; + + if (!ext->descriptor) + return; + + if (dvb_ext_descriptors[type].free) + dvb_ext_descriptors[type].free(ext->descriptor); + + free(ext->descriptor); +} + +void extension_descriptor_print(struct dvb_v5_fe_parms *parms, + const struct dvb_desc *desc) +{ + struct dvb_extension_descriptor *ext = (void *)desc; + uint8_t type = ext->extension_code; + dvb_log("Extension descriptor %s type 0x%02x", + dvb_ext_descriptors[type].name, type); - if (ext->descriptor) - free(ext->descriptor); + if (dvb_ext_descriptors[type].print) + dvb_ext_descriptors[type].print(parms, ext, ext->descriptor); } -- 2.7.4