tools:iio: free channel-array completely
authorHartmut Knaack <knaack.h@gmx.de>
Sun, 31 May 2015 12:39:44 +0000 (14:39 +0200)
committerJonathan Cameron <jic23@kernel.org>
Sun, 31 May 2015 16:20:16 +0000 (17:20 +0100)
In iio_utils.c build_channel_array() dynamically allocates the string
generic_name in the current iio_channel_info, which doesn't got freed in
case of an error.
This dynamically allocated channel-array is used by generic_buffer, and
needs to be freed on the error/exit path.

Signed-off-by: Hartmut Knaack <knaack.h@gmx.de>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
tools/iio/generic_buffer.c
tools/iio/iio_utils.c

index 7859ee9..0410948 100644 (file)
@@ -255,7 +255,7 @@ int main(int argc, char **argv)
                       "%siio:device%d/buffer", iio_dir, dev_num);
        if (ret < 0) {
                ret = -ENOMEM;
-               goto error_free_triggername;
+               goto error_free_channels;
        }
 
        if (!notrigger) {
@@ -351,6 +351,12 @@ error_free_data:
        free(data);
 error_free_buf_dir_name:
        free(buf_dir_name);
+error_free_channels:
+       for (i = num_channels - 1; i >= 0; i--) {
+               free(channels[i].name);
+               free(channels[i].generic_name);
+       }
+       free(channels);
 error_free_triggername:
        if (datardytrigger)
                free(trigger_name);
index f879ad7..6daf98f 100644 (file)
@@ -410,8 +410,10 @@ int build_channel_array(const char *device_dir,
        return 0;
 
 error_cleanup_array:
-       for (i = count - 1;  i >= 0; i--)
+       for (i = count - 1;  i >= 0; i--) {
                free((*ci_array)[i].name);
+               free((*ci_array)[i].generic_name);
+       }
        free(*ci_array);
 error_close_dir:
        closedir(dp);