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.
ret = zip_fread(vdev->capfile, buf, CHUNKSIZE);
if (ret > 0) {
ret = zip_fread(vdev->capfile, buf, CHUNKSIZE);
if (ret > 0) {
if (vdev->cur_analog_channel != 0) {
if (vdev->cur_analog_channel != 0) {
packet.type = SR_DF_ANALOG;
packet.payload = &analog;
/* TODO: Use proper 'digits' value for this device (and its modes). */
packet.type = SR_DF_ANALOG;
packet.payload = &analog;
/* TODO: Use proper 'digits' value for this device (and its modes). */
analog.meaning->unit = SR_UNIT_VOLT;
analog.meaning->mqflags = SR_MQFLAG_DC;
analog.data = (float *) buf;
analog.meaning->unit = SR_UNIT_VOLT;
analog.meaning->mqflags = SR_MQFLAG_DC;
analog.data = (float *) buf;
+ } 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);
if (ret % vdev->unitsize != 0)
sr_warn("Read size %d not a multiple of the"
" unit size %d.", ret, vdev->unitsize);
logic.length = ret;
logic.unitsize = vdev->unitsize;
logic.data = buf;
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);
} else {
/* done with this capture file */
zip_fclose(vdev->capfile);