layerscape: fix get_device_file() function of restool
The restool failed to work with current gcc-7.3.0-musl. This patch is to add a restool fix-up patch to fix 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: Yangbo Lu <yangbo.lu@nxp.com>
This commit is contained in:
		 Yangbo Lu
					Yangbo Lu
				
			
				
					committed by
					
						 Hauke Mehrtens
						Hauke Mehrtens
					
				
			
			
				
	
			
			
			 Hauke Mehrtens
						Hauke Mehrtens
					
				
			
						parent
						
							0f44c7c8d1
						
					
				
				
					commit
					db30adc931
				
			| @@ -0,0 +1,107 @@ | |||||||
|  | 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 | ||||||
|  |  | ||||||
		Reference in New Issue
	
	Block a user