OpenWrt – Rev 1

Subversion Repositories:
Rev:
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


Generated by GNU Enscript 1.6.5.90.