Mon 14 Oct 23:06:38 CEST 2024
This commit is contained in:
		
							parent
							
								
									78e12f4a56
								
							
						
					
					
						commit
						c307abcaee
					
				
							
								
								
									
										162
									
								
								kernel/is_valid.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										162
									
								
								kernel/is_valid.c
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,162 @@ | ||||||
|  | /*
 | ||||||
|  | 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 | ||||||
|  | 
 | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user