@@ -34,7 +34,8 @@ struct dvb_desc_service_list {
uint8_t length;
struct dvb_desc *next;
- //struct dvb_desc_service_list_table services[];
+ /* FIXME */
+ /* struct dvb_desc_service_list_table services[]; */
} __attribute__((packed));
struct dvb_v5_fe_parms;
@@ -1345,7 +1345,7 @@ void dvb_hexdump(struct dvb_v5_fe_parms *parms, const char *prefix, const unsign
strncat(hex, " ", sizeof(hex) - 1);
if (j == 16) {
ascii[j] = '\0';
- dvb_log("%s%s %s", prefix, hex, ascii);
+ dvb_loginfo("%s%s %s", prefix, hex, ascii);
j = 0;
hex[0] = '\0';
}
@@ -25,10 +25,14 @@
int dvb_desc_sat_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc)
{
struct dvb_desc_sat *sat = (struct dvb_desc_sat *) desc;
- /* copy from .length */
- memcpy(((uint8_t *) sat ) + sizeof(sat->type) + sizeof(sat->next) + sizeof(sat->length),
- buf,
- sat->length);
+ ssize_t size = sizeof(struct dvb_desc_sat) - sizeof(struct dvb_desc);
+
+ if (size > desc->length) {
+ dvb_logerr("dvb_desc_sat_init short read %d/%zd bytes", desc->length, size);
+ return -1;
+ }
+
+ memcpy(desc->data, buf, size);
bswap16(sat->orbit);
bswap32(sat->bitfield);
bswap32(sat->frequency);
@@ -26,27 +26,59 @@
int dvb_desc_service_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc)
{
struct dvb_desc_service *service = (struct dvb_desc_service *) desc;
+ const uint8_t *endbuf = buf + desc->length;
uint8_t len; /* the length of the string in the input data */
uint8_t len1, len2; /* the lenght of the output strings */
+ service->provider = NULL;
+ service->provider_emph = NULL;
+ service->name = NULL;
+ service->name_emph = NULL;
+
+ if (buf + 1 > endbuf) {
+ dvb_logerr("%s: short read %d bytes", __func__, 1);
+ return -1;
+ }
service->service_type = buf[0];
buf++;
- service->provider = NULL;
- service->provider_emph = NULL;
+ if (buf + 1 > endbuf) {
+ dvb_logerr("%s: a short read %d bytes", __func__, 1);
+ return -1;
+ }
+
len = buf[0];
- buf++;
len1 = len;
- dvb_parse_string(parms, &service->provider, &service->provider_emph, buf, len1);
- buf += len;
+ buf++;
+
+ if (buf + len > endbuf) {
+ dvb_logerr("%s: b short read %d bytes", __func__, len);
+ return -1;
+ }
+
+ if (len) {
+ dvb_parse_string(parms, &service->provider, &service->provider_emph, buf, len1);
+ buf += len;
+ }
+
+ if (buf + 1 > endbuf) {
+ dvb_logerr("%s: c short read %d bytes", __func__, 1);
+ return -1;
+ }
- service->name = NULL;
- service->name_emph = NULL;
len = buf[0];
len2 = len;
buf++;
- dvb_parse_string(parms, &service->name, &service->name_emph, buf, len2);
- buf += len;
+
+ if (buf + len > endbuf) {
+ dvb_logerr("%s: d short read %d bytes", __func__, len);
+ return -1;
+ }
+
+ if (len) {
+ dvb_parse_string(parms, &service->name, &service->name_emph, buf, len2);
+ buf += len;
+ }
return 0;
}
- use loginfo in hexdump - use C comments - memory checking in desc_sat and desc_service Signed-off-by: André Roth <neolynx@gmail.com> --- lib/include/libdvbv5/desc_service_list.h | 3 +- lib/libdvbv5/descriptors.c | 2 +- lib/libdvbv5/descriptors/desc_sat.c | 12 +++++--- lib/libdvbv5/descriptors/desc_service.c | 50 ++++++++++++++++++++++++++------ 4 files changed, 52 insertions(+), 15 deletions(-)