Skip to content

Commit

Permalink
tools/iio/iio_utils:fix memory leak
Browse files Browse the repository at this point in the history
[ Upstream commit f2edf0c819a4823cd6c288801ce737e8d4fcde06 ]

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 <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Jonathan Cameron <[email protected]>
Signed-off-by: Sasha Levin <[email protected]>
  • Loading branch information
Yulong Zhang authored and gregkh committed Mar 11, 2023
1 parent 438d62a commit 40721ad
Showing 1 changed file with 6 additions and 17 deletions.
23 changes: 6 additions & 17 deletions tools/iio/iio_utils.c
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,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:
Expand Down Expand Up @@ -345,9 +346,9 @@ int build_channel_array(const char *device_dir,
}

sysfsfp = fopen(filename, "r");
free(filename);
if (!sysfsfp) {
ret = -errno;
free(filename);
goto error_close_dir;
}

Expand All @@ -357,19 +358,16 @@ int build_channel_array(const char *device_dir,
if (fclose(sysfsfp))
perror("build_channel_array(): Failed to close file");

free(filename);
goto error_close_dir;
}
if (ret == 1)
(*counter)++;

if (fclose(sysfsfp)) {
ret = -errno;
free(filename);
goto error_close_dir;
}

free(filename);
}

*ci_array = malloc(sizeof(**ci_array) * (*counter));
Expand All @@ -395,30 +393,27 @@ int build_channel_array(const char *device_dir,
}

sysfsfp = fopen(filename, "r");
free(filename);
if (!sysfsfp) {
ret = -errno;
free(filename);
count--;
goto error_cleanup_array;
}

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;
}
Expand All @@ -429,7 +424,6 @@ int build_channel_array(const char *device_dir,
strlen(ent->d_name) -
strlen("_en"));
if (!current->name) {
free(filename);
ret = -ENOMEM;
count--;
goto error_cleanup_array;
Expand All @@ -439,7 +433,6 @@ int build_channel_array(const char *device_dir,
ret = iioutils_break_up_name(current->name,
&current->generic_name);
if (ret) {
free(filename);
free(current->name);
count--;
goto error_cleanup_array;
Expand All @@ -450,17 +443,16 @@ int build_channel_array(const char *device_dir,
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;
}

Expand All @@ -470,17 +462,14 @@ int build_channel_array(const char *device_dir,
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",
Expand Down

0 comments on commit 40721ad

Please sign in to comment.