163 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			163 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
| Copyright (C) 2016-2019 The University of Notre Dame
 | |
| This software is distributed under the GNU General Public License.
 | |
| See the file LICENSE for details.
 | |
| */
 | |
| 
 | |
| #include "is_valid.h"
 | |
| #include "string.h"
 | |
| #include "kobject.h"
 | |
| #include "process.h"
 | |
| #include "kmalloc.h"
 | |
| 
 | |
| // Does this string comprise a valid path?
 | |
| // Valid paths are comprised of the following characters:
 | |
| // CHARS		|	ASCII CODE
 | |
| // '-'			|	45
 | |
| // '.'			|	46
 | |
| // '/'			|	47
 | |
| // [0-9]		|	[48-57]
 | |
| // [a-z]		|	[65-90]
 | |
| // '_'			|	95
 | |
| // [A-Z]		|	[97-122]
 | |
| 
 | |
| int is_valid_path(const char * s)
 | |
| {
 | |
| 	int length = strlen(s);
 | |
| 	for (int i = 0; i < length; i++) {
 | |
| 		if (s[i] < 45) return 0;
 | |
| 		if (s[i] > 57 && s[i] < 65) return 0;
 | |
| 		if (s[i] > 90 && s[i] < 95) return 0;
 | |
| 		if (s[i] > 95 && s[i] < 97) return 0;
 | |
| 		if (s[i] > 122) return 0;
 | |
| 	}
 | |
| 	return 1;
 | |
| }
 | |
| 
 | |
| // Does this string comprise a valid tag? 
 | |
| // CHARS		|	ASCII CODE
 | |
| // [0-9]		|	[48-57]
 | |
| // [a-z]		|	[65-90]
 | |
| // [A-Z]		|	[97-122]
 | |
| 
 | |
| int is_valid_tag(const char * s)
 | |
| {
 | |
| 	int length = strlen(s);
 | |
| 	for (int i = 0; i < length; i++) {
 | |
| 		if (s[i] < 48) return 0;
 | |
| 		if (s[i] > 57 && s[i] < 65) return 0;
 | |
| 		if (s[i] > 90 && s[i] < 95) return 0;
 | |
| 		if (s[i] > 95 && s[i] < 97) return 0;
 | |
| 		if (s[i] > 122) return 0;
 | |
| 	}
 | |
| 	return 1;
 | |
| }
 | |
| 
 | |
| // Does this string point to a valid resource (i.e. is it a legitimate
 | |
| // tag-path concatenation)?
 | |
| // CHARS		|	ASCII CODE
 | |
| // ':'			|	58
 | |
| 
 | |
| int is_valid_location(const char * s)
 | |
| {
 | |
| 	int length = strlen(s);
 | |
| 	char * mutable_test = kmalloc(sizeof(char) * (length+1));
 | |
| 	strcpy(mutable_test, s);
 | |
| 
 | |
| 	int path_index = 0;
 | |
| 	while (path_index < length && s[path_index] != 58) {
 | |
| 		path_index += 1;
 | |
| 	}
 | |
| 	mutable_test[path_index++] = 0;
 | |
| 
 | |
| 	if (is_valid_tag(mutable_test)
 | |
| 		&& is_valid_path(mutable_test + path_index)) {
 | |
| 		return 1;
 | |
| 	}
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| // Return true if file desciptor is in range and refers to a live object.
 | |
| int is_valid_object( int fd )
 | |
| {
 | |
| 	return fd>=0 && fd<PROCESS_MAX_OBJECTS && current->ktable[fd];
 | |
| }
 | |
| 
 | |
| // Return true if fd valid and object is also of indicated type.
 | |
| int is_valid_object_type( int fd, kobject_type_t type )
 | |
| {
 | |
| 	return is_valid_object(fd) && kobject_get_type(current->ktable[fd])==type;
 | |
| }
 | |
| 
 | |
| // Return true if (ptr,length) describes a valid area in user space.
 | |
| // XXX Needs to be implemented!
 | |
| 
 | |
| int is_valid_pointer( void *ptr, int length )
 | |
| {
 | |
| 	return 1;
 | |
| }
 | |
| 
 | |
| // Return true if string points to a valid area in user space.
 | |
| // XXX Needs to be implemented!
 | |
| 
 | |
| int is_valid_string( const char *str )
 | |
| {
 | |
| 	return 1;
 | |
| }
 | |
| 
 | |
| #ifdef TEST
 | |
| void is_valid_test()
 | |
| {
 | |
| 	printf("Testing PATH validations...\n");
 | |
| 	char * s = "/root/is-valid.path";
 | |
| 	if (!is_valid_path(s))
 | |
| 		printf("ERROR: Did not validate %s\n", s);
 | |
| 	s = "abcdefghijklmnopqrstuvwxyz";
 | |
| 	if (!is_valid_path(s))
 | |
| 		printf("ERROR: Did not validate %s\n", s);
 | |
| 	s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
 | |
| 	if (!is_valid_path(s))
 | |
| 		printf("ERROR: Did not validate %s\n", s);
 | |
| 	s = "0123456789";
 | |
| 	if (!is_valid_path(s))
 | |
| 		printf("ERROR: Did not validate %s\n", s);
 | |
| 	s = "/root/isn't/valid:";
 | |
| 	if (is_valid_path(s))
 | |
| 		printf("ERROR: Did not invalidate %s\n", s);
 | |
| 
 | |
| 	printf("Testing Tag Validations...\n");
 | |
| 	s = "TAG";
 | |
| 	if (!is_valid_tag(s))
 | |
| 		printf("ERROR: Did not validate %s\n", s);
 | |
| 	s = "abcdefghijklmnopqrstuvwxyz";
 | |
| 	if (!is_valid_tag(s))
 | |
| 		printf("ERROR: Did not validate %s\n", s);
 | |
| 	s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
 | |
| 	if (!is_valid_tag(s))
 | |
| 		printf("ERROR: Did not validate %s\n", s);
 | |
| 	s = "0123456789";
 | |
| 	if (!is_valid_tag(s))
 | |
| 		printf("ERROR: Did not validate %s\n", s);
 | |
| 	s = ":NOT-A-TAG";
 | |
| 	if (is_valid_tag(s))
 | |
| 		printf("ERROR: Did not invalidate %s\n", s);
 | |
| 
 | |
| 	printf("Testing Location Validations...\n");
 | |
| 	s = "HOME:path/to/root/dir";
 | |
| 	if (!is_valid_location(s))
 | |
| 		printf("ERROR: Did not validate %s\n", s);
 | |
| 	s = "TAG";
 | |
| 	if (!is_valid_tag(s))
 | |
| 		printf("ERROR: Did not validate %s\n", s);
 | |
| 	s = "/root/is-valid.path";
 | |
| 	if (!is_valid_path(s))
 | |
| 		printf("ERROR: Did not validate %s\n", s);
 | |
| 	s = "BAD-TAG:p@th/:/root/dir";
 | |
| 	if (is_valid_location(s))
 | |
| 		printf("ERROR: Did not invalidate %s\n", s);
 | |
| 
 | |
| }
 | |
| 
 | |
| #endif
 | |
| 
 |