123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- From 37f0f1550e7822584b858edde416a694fb902236 Mon Sep 17 00:00:00 2001
- From: Ioana Ciornei <ioana.ciornei@nxp.com>
- Date: Tue, 31 Jul 2018 13:33:20 +0300
- Subject: [PATCH] restool: fix get_device_file() function
- This patch fixes multiple problems encountered in the
- get_device_file() function:
- - The deprecated atoi() function is replaced by strtoul
- - An invalid memory access was being performed by using
- memory from dir->d_name even after closedir(). This is
- fixed by a strdup() on the device filename.
- - Also, error prints now print any relevant error code.
- Signed-off-by: Ioana Ciornei <ioana.ciornei@nxp.com>
- ---
- restool.c | 44 ++++++++++++++++++++++++++++----------------
- 1 file changed, 28 insertions(+), 16 deletions(-)
- diff --git a/restool.c b/restool.c
- index 7553659..78fd1bf 100644
- --- a/restool.c
- +++ b/restool.c
- @@ -1185,8 +1185,13 @@ out:
-
- static int get_device_file(void)
- {
- + int num_dev_files = 0;
- + struct dirent *dir;
- int error = 0;
- + char *device;
- int num_char;
- + long val;
- + DIR *d;
-
- memset(restool.device_file, '\0', DEV_FILE_SIZE);
-
- @@ -1214,10 +1219,6 @@ static int get_device_file(void)
- goto out;
- }
- } else {
- - DIR *d;
- - struct dirent *dir;
- - int num_dev_files = 0;
- - char *dprc_index;
-
- d = opendir("/dev");
- if (!d) {
- @@ -1227,26 +1228,34 @@ static int get_device_file(void)
- }
- while ((dir = readdir(d)) != NULL) {
- if (strncmp(dir->d_name, "dprc.", 5) == 0) {
- - dprc_index = &dir->d_name[5];
- - num_dev_files += 1;
- + if (num_dev_files == 0)
- + device = strdup(dir->d_name);
- + num_dev_files++;
- }
- }
- closedir(d);
-
- if (num_dev_files == 1) {
- - int temp_len = strlen(dprc_index);
- + errno = 0;
- + val = strtoul(&device[5], NULL, 0);
- + if ((errno == ERANGE && val == LONG_MAX) ||
- + ( errno != 0 && val == 0 )) {
- + ERROR_PRINTF("error: device file malformed\n");
- + error = -1;
- + goto out_free_device;;
- + }
- + restool.root_dprc_id = val;
-
- - temp_len += 10;
- - num_char = sprintf(restool.device_file, "/dev/dprc.%s",
- - dprc_index);
- - if (num_char != temp_len) {
- - ERROR_PRINTF("sprintf error\n");
- + num_char = snprintf(restool.device_file, DEV_FILE_SIZE,
- + "/dev/dprc.%d", restool.root_dprc_id);
- + if (num_char < 0 || num_char >= DEV_FILE_SIZE) {
- + ERROR_PRINTF("error: device file malformed\n");
- error = -1;
- - goto out;
- + goto out_free_device;
- }
- - restool.root_dprc_id = atoi(dprc_index);
- - if (access(restool.device_file, F_OK) != 0)
- - printf("no such dev file\n");
- + error = access(restool.device_file, F_OK);
- + if (error != 0)
- + ERROR_PRINTF("error: access(%s) = %d\n", restool.device_file, error);
- } else {
- error = -1;
- if (num_dev_files == 0)
- @@ -1255,6 +1264,9 @@ static int get_device_file(void)
- ERROR_PRINTF("error: multiple root containers\n");
- }
- }
- +
- +out_free_device:
- + free(device);
- out:
- return error;
- }
- --
- 2.17.1
|