check that arguments aren't more than a page in exec()
This commit is contained in:
		
							parent
							
								
									0f684b9150
								
							
						
					
					
						commit
						b78894f34e
					
				
					 1 changed files with 6 additions and 1 deletions
				
			
		
							
								
								
									
										7
									
								
								exec.c
									
										
									
									
									
								
							
							
						
						
									
										7
									
								
								exec.c
									
										
									
									
									
								
							|  | @ -13,7 +13,7 @@ exec(char *path, char **argv) | |||
| { | ||||
|   char *s, *last; | ||||
|   int i, off; | ||||
|   uint64 argc, sz, sp, ustack[MAXARG+1]; | ||||
|   uint64 argc, sz, sp, ustack[MAXARG+1], stackbase; | ||||
|   struct elfhdr elf; | ||||
|   struct inode *ip; | ||||
|   struct proghdr ph; | ||||
|  | @ -66,6 +66,7 @@ exec(char *path, char **argv) | |||
|   if((sz = uvmalloc(pagetable, sz, sz + 2*PGSIZE)) == 0) | ||||
|     goto bad; | ||||
|   sp = sz; | ||||
|   stackbase = sp - PGSIZE; | ||||
| 
 | ||||
|   // Push argument strings, prepare rest of stack in ustack.
 | ||||
|   for(argc = 0; argv[argc]; argc++) { | ||||
|  | @ -73,6 +74,8 @@ exec(char *path, char **argv) | |||
|       goto bad; | ||||
|     sp -= strlen(argv[argc]) + 1; | ||||
|     sp -= sp % 16; // riscv sp must be 16-byte aligned
 | ||||
|     if(sp < stackbase) | ||||
|       goto bad; | ||||
|     if(copyout(pagetable, sp, argv[argc], strlen(argv[argc]) + 1) < 0) | ||||
|       goto bad; | ||||
|     ustack[argc] = sp; | ||||
|  | @ -82,6 +85,8 @@ exec(char *path, char **argv) | |||
|   // push the array of argv[] pointers.
 | ||||
|   sp -= (argc+1) * sizeof(uint64); | ||||
|   sp -= sp % 16; | ||||
|   if(sp < stackbase) | ||||
|     goto bad; | ||||
|   if(copyout(pagetable, sp, (char *)ustack, (argc+1)*sizeof(uint64)) < 0) | ||||
|     goto bad; | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Robert Morris
						Robert Morris