tools/iio/iio_utils:fix memory leak
[linux-2.6-block.git] / tools / iio / iio_utils.c
index 8d35893b2fa856741d8098da41add733c2ce25cb..6a00a6eecaef02bbb911741fc23e39614d8bdc90 100644 (file)
@@ -264,6 +264,7 @@ int iioutils_get_param_float(float *output, const char *param_name,
                        if (fscanf(sysfsfp, "%f", output) != 1)
                                ret = errno ? -errno : -ENODATA;
 
+                       fclose(sysfsfp);
                        break;
                }
 error_free_filename:
@@ -345,9 +346,9 @@ int build_channel_array(const char *device_dir, int buffer_idx,
                        }
 
                        sysfsfp = fopen(filename, "r");
+                       free(filename);
                        if (!sysfsfp) {
                                ret = -errno;
-                               free(filename);
                                goto error_close_dir;
                        }
 
@@ -357,7 +358,6 @@ int build_channel_array(const char *device_dir, int buffer_idx,
                                if (fclose(sysfsfp))
                                        perror("build_channel_array(): Failed to close file");
 
-                               free(filename);
                                goto error_close_dir;
                        }
                        if (ret == 1)
@@ -365,11 +365,9 @@ int build_channel_array(const char *device_dir, int buffer_idx,
 
                        if (fclose(sysfsfp)) {
                                ret = -errno;
-                               free(filename);
                                goto error_close_dir;
                        }
 
-                       free(filename);
                }
 
        *ci_array = malloc(sizeof(**ci_array) * (*counter));
@@ -395,9 +393,9 @@ int build_channel_array(const char *device_dir, int buffer_idx,
                        }
 
                        sysfsfp = fopen(filename, "r");
+                       free(filename);
                        if (!sysfsfp) {
                                ret = -errno;
-                               free(filename);
                                count--;
                                goto error_cleanup_array;
                        }
@@ -405,20 +403,17 @@ int build_channel_array(const char *device_dir, int buffer_idx,
                        errno = 0;
                        if (fscanf(sysfsfp, "%i", &current_enabled) != 1) {
                                ret = errno ? -errno : -ENODATA;
-                               free(filename);
                                count--;
                                goto error_cleanup_array;
                        }
 
                        if (fclose(sysfsfp)) {
                                ret = -errno;
-                               free(filename);
                                count--;
                                goto error_cleanup_array;
                        }
 
                        if (!current_enabled) {
-                               free(filename);
                                count--;
                                continue;
                        }
@@ -429,7 +424,6 @@ int build_channel_array(const char *device_dir, int buffer_idx,
                                                strlen(ent->d_name) -
                                                strlen("_en"));
                        if (!current->name) {
-                               free(filename);
                                ret = -ENOMEM;
                                count--;
                                goto error_cleanup_array;
@@ -439,7 +433,6 @@ int build_channel_array(const char *device_dir, int buffer_idx,
                        ret = iioutils_break_up_name(current->name,
                                                     &current->generic_name);
                        if (ret) {
-                               free(filename);
                                free(current->name);
                                count--;
                                goto error_cleanup_array;
@@ -450,17 +443,16 @@ int build_channel_array(const char *device_dir, int buffer_idx,
                                       scan_el_dir,
                                       current->name);
                        if (ret < 0) {
-                               free(filename);
                                ret = -ENOMEM;
                                goto error_cleanup_array;
                        }
 
                        sysfsfp = fopen(filename, "r");
+                       free(filename);
                        if (!sysfsfp) {
                                ret = -errno;
-                               fprintf(stderr, "failed to open %s\n",
-                                       filename);
-                               free(filename);
+                               fprintf(stderr, "failed to open %s/%s_index\n",
+                                       scan_el_dir, current->name);
                                goto error_cleanup_array;
                        }
 
@@ -470,17 +462,14 @@ int build_channel_array(const char *device_dir, int buffer_idx,
                                if (fclose(sysfsfp))
                                        perror("build_channel_array(): Failed to close file");
 
-                               free(filename);
                                goto error_cleanup_array;
                        }
 
                        if (fclose(sysfsfp)) {
                                ret = -errno;
-                               free(filename);
                                goto error_cleanup_array;
                        }
 
-                       free(filename);
                        /* Find the scale */
                        ret = iioutils_get_param_float(&current->scale,
                                                       "scale",