OSDN Git Service

tools/iio/iio_utils:fix memory leak
authorYulong Zhang <yulong.zhang@metoak.net>
Tue, 17 Jan 2023 02:51:47 +0000 (10:51 +0800)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Sat, 21 Jan 2023 17:52:26 +0000 (17:52 +0000)
1. fopen sysfs without fclose.
2. asprintf filename without free.
3. if asprintf return error,do not need to free the buffer.

Signed-off-by: Yulong Zhang <yulong.zhang@metoak.net>
Link: https://lore.kernel.org/r/20230117025147.69890-1-yulong.zhang@metoak.net
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
tools/iio/iio_utils.c

index 8d35893..6a00a6e 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",