]> sigrok.org Git - libsigrok.git/commitdiff
session_driver: avoid division by zero, catch API violation
authorGerhard Sittig <redacted>
Thu, 8 Feb 2018 21:18:02 +0000 (22:18 +0100)
committerUwe Hermann <redacted>
Fri, 9 Feb 2018 20:34:09 +0000 (21:34 +0100)
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.

src/session_driver.c

index c6af3b6dc04342fe136080f0315fef3ddf275696..27868d0166634aa89ecbde3d85c460c5cc9f85e8 100644 (file)
@@ -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);