diff options
author | Mauro Carvalho Chehab <mchehab+huawei@kernel.org> | 2021-02-23 13:37:08 +0100 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab+huawei@kernel.org> | 2021-02-23 13:38:40 +0100 |
commit | b5483d01da02257375e39a268cbc02d449bbcfde (patch) | |
tree | 5cabc1b19891084886cf396dd5540e5ec58faa3d | |
parent | d83e06e3ad829bd43829f71fad316d2ca9d37e8d (diff) | |
download | v4l-utils-b5483d01da02257375e39a268cbc02d449bbcfde.tar.gz |
libdvbv5: validate cable descriptor's size
Check if the size has the expected value.
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
-rw-r--r-- | lib/libdvbv5/descriptors/desc_cable_delivery.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/lib/libdvbv5/descriptors/desc_cable_delivery.c b/lib/libdvbv5/descriptors/desc_cable_delivery.c index 3c969d90..1625792c 100644 --- a/lib/libdvbv5/descriptors/desc_cable_delivery.c +++ b/lib/libdvbv5/descriptors/desc_cable_delivery.c @@ -29,10 +29,20 @@ int dvb_desc_cable_delivery_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc) { struct dvb_desc_cable_delivery *cable = (struct dvb_desc_cable_delivery *) desc; + size_t len, dlen = desc->length; + size_t start; + + start = offsetof(struct dvb_desc_cable_delivery, frequency); + len = sizeof(*cable) - start; + + if (len != dlen) { + dvb_logwarn("cable delivery descriptor size is wrong: expected %zu, received %zu", + len, dlen); + return -1; + } + /* copy only the data - length already initialize */ - memcpy(((uint8_t *) cable ) + sizeof(cable->type) + sizeof(cable->next) + sizeof(cable->length), - buf, - cable->length); + memcpy(((uint8_t *) cable) + start, buf, dlen); bswap32(cable->frequency); bswap16(cable->bitfield1); bswap32(cable->bitfield2); |