iio.c: Check return of fscanf
[contrib/mraa.git] / src / iio / iio.c
old mode 100755 (executable)
new mode 100644 (file)
index ef2cb3e..ddc7157
@@ -111,6 +111,7 @@ mraa_iio_get_channel_data(mraa_iio_context dev)
             fd = open(buf, O_RDONLY);
             if (fd != -1) {
                 if (read(fd, readbuf, 2 * sizeof(char)) != 2) {
+                    close(fd);
                     break;
                 }
                 chan_num = ((int) strtol(readbuf, NULL, 10));
@@ -440,10 +441,14 @@ mraa_iio_event_poll(mraa_iio_context dev, struct iio_event_data* data)
     int event_fd;
     int fd;
 
-    sprintf(bu, IIO_SLASH_DEV "%d", dev->num);
+    snprintf(bu, MAX_SIZE, IIO_SLASH_DEV "%d", dev->num);
     fd = open(bu, 0);
-    ret = ioctl(fd, IIO_GET_EVENT_FD_IOCTL, &event_fd);
-    close(fd);
+    if (fd != -1) {
+        ret = ioctl(fd, IIO_GET_EVENT_FD_IOCTL, &event_fd);
+        close(fd);
+    } else {
+        return MRAA_ERROR_UNSPECIFIED;
+    }
 
     if (ret == -1 || event_fd == -1)
         return MRAA_ERROR_UNSPECIFIED;
@@ -526,14 +531,18 @@ mraa_iio_get_mounting_matrix(mraa_iio_context dev, float mm[9])
 {
     char buf[MAX_SIZE];
     FILE* fp;
+    int ret;
 
     memset(buf, 0, MAX_SIZE);
     snprintf(buf, MAX_SIZE, IIO_SYSFS_DEVICE "%d/" IIO_MOUNTING_MATRIX, dev->num);
     fp = fopen(buf, "r");
     if (fp != NULL) {
-        fscanf(fp, "%f %f %f\n%f %f %f\n%f %f %f\n", &mm[0], &mm[1], &mm[2], &mm[3], &mm[4], &mm[5],
+        ret = fscanf(fp, "%f %f %f\n%f %f %f\n%f %f %f\n", &mm[0], &mm[1], &mm[2], &mm[3], &mm[4], &mm[5],
                &mm[6], &mm[7], &mm[8]);
         fclose(fp);
+        if (ret != 9) {
+            return MRAA_ERROR_UNSPECIFIED;
+        }
         return MRAA_SUCCESS;
     }
     return MRAA_ERROR_UNSPECIFIED;
@@ -550,9 +559,9 @@ mraa_iio_create_trigger(mraa_iio_context dev, const char* trigger)
     if (stat(IIO_CONFIGFS_TRIGGER, &configfs_status) == 0) {
         memset(buf, 0, MAX_SIZE);
         snprintf(buf, MAX_SIZE, IIO_CONFIGFS_TRIGGER "%s", trigger);
-       // we actually don't care if this doesn't succeed, as it just means
-       // it's already been initialised
-       mkdir(buf, configfs_status.st_mode);
+    // we actually don't care if this doesn't succeed, as it just means
+    // it's already been initialised
+    mkdir(buf, configfs_status.st_mode);
     }
 
     return MRAA_ERROR_UNSPECIFIED;
@@ -598,6 +607,8 @@ mraa_iio_update_channels(mraa_iio_context dev)
                             if (read(fd, readbuf, 2 * sizeof(char)) != 2) {
                                 syslog(LOG_ERR, "iio: Failed to read a sensible value from sysfs");
                                 free(str);
+                                close(fd);
+                                closedir(dir);
                                 return -1;
                             }
                             chan->enabled = (int) strtol(readbuf, NULL, 10);
@@ -616,8 +627,11 @@ mraa_iio_update_channels(mraa_iio_context dev)
                 }
             }
         }
+        closedir(dir);
+        return MRAA_SUCCESS;
     }
-    return MRAA_SUCCESS;
+
+    return MRAA_ERROR_INVALID_HANDLE;
 }
 
 mraa_result_t