iio.c: Check return of fd before using ioctl
[contrib/mraa.git] / src / iio / iio.c
old mode 100755 (executable)
new mode 100644 (file)
index a9c1ef9..26dba06
@@ -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));
@@ -365,6 +366,7 @@ mraa_iio_get_event_data(mraa_iio_context dev)
     int curr_bytes = 0;
     char shortbuf, signchar;
     memset(buf, 0, MAX_SIZE);
+    memset(readbuf, 0, 32);
     snprintf(buf, MAX_SIZE, IIO_SYSFS_DEVICE "%d/" IIO_EVENTS, dev->num);
     dir = opendir(buf);
     if (dir != NULL) {
@@ -439,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;
@@ -544,17 +550,14 @@ mraa_iio_create_trigger(mraa_iio_context dev, const char* trigger)
     struct stat configfs_status;
     struct stat trigger_status;
     char buf[MAX_SIZE];
+    int ret;
 
     if (stat(IIO_CONFIGFS_TRIGGER, &configfs_status) == 0) {
         memset(buf, 0, MAX_SIZE);
         snprintf(buf, MAX_SIZE, IIO_CONFIGFS_TRIGGER "%s", trigger);
-        if (stat(buf, &trigger_status) != 0) {
-            if (mkdir(buf, configfs_status.st_mode) == 0)
-                return MRAA_SUCCESS;
-        } else {
-            // trigger folder already created
-            return MRAA_SUCCESS;
-        }
+    // 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;
@@ -600,6 +603,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);
@@ -618,8 +623,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