From: Gerhard Sittig Date: Thu, 8 Feb 2018 21:18:02 +0000 (+0100) Subject: session_driver: avoid division by zero, catch API violation X-Git-Url: https://sigrok.org/gitweb/?p=libsigrok.git;a=commitdiff_plain;h=7ee8511be45fa75a683aaff05d21cc6cf40ef75c session_driver: avoid division by zero, catch API violation Avoid a division by zero, by not using a zero unitsize in a modulo operation. As a byproduct, avoid processing and counting input that neither has analog nor logic data. This should never have happened, but the change now catches the error if invalid input is seen. This was reported by clang's scan-build. --- diff --git a/src/session_driver.c b/src/session_driver.c index c6af3b6d..27868d01 100644 --- a/src/session_driver.c +++ b/src/session_driver.c @@ -150,8 +150,8 @@ static gboolean stream_session_data(struct sr_dev_inst *sdi) ret = zip_fread(vdev->capfile, buf, CHUNKSIZE); if (ret > 0) { - got_data = TRUE; if (vdev->cur_analog_channel != 0) { + got_data = TRUE; packet.type = SR_DF_ANALOG; packet.payload = &analog; /* TODO: Use proper 'digits' value for this device (and its modes). */ @@ -164,7 +164,8 @@ static gboolean stream_session_data(struct sr_dev_inst *sdi) analog.meaning->unit = SR_UNIT_VOLT; analog.meaning->mqflags = SR_MQFLAG_DC; analog.data = (float *) buf; - } else { + } else if (vdev->unitsize) { + got_data = TRUE; if (ret % vdev->unitsize != 0) sr_warn("Read size %d not a multiple of the" " unit size %d.", ret, vdev->unitsize); @@ -173,9 +174,17 @@ static gboolean stream_session_data(struct sr_dev_inst *sdi) logic.length = ret; logic.unitsize = vdev->unitsize; logic.data = buf; + } else { + /* + * Neither analog data, nor logic which has + * unitsize, must be an unexpected API use. + */ + sr_warn("Neither analog nor logic data. Ignoring."); + } + if (got_data) { + vdev->bytes_read += ret; + sr_session_send(sdi, &packet); } - vdev->bytes_read += ret; - sr_session_send(sdi, &packet); } else { /* done with this capture file */ zip_fclose(vdev->capfile);