RS: fix bug that overflows r_argv[]
. reported and debugged by Arne Welzel . problem is if there are too many args . there is a check, but then unconditional NULL termination
This commit is contained in:
		
							parent
							
								
									000a9d36be
								
							
						
					
					
						commit
						3dd7649ae7
					
				@ -181,11 +181,17 @@ PUBLIC void build_cmd_dep(struct rproc *rp)
 | 
				
			|||||||
          *cmd_ptr = '\0';			/* terminate previous */
 | 
					          *cmd_ptr = '\0';			/* terminate previous */
 | 
				
			||||||
	  while (*++cmd_ptr == ' ') ; 		/* skip spaces */
 | 
						  while (*++cmd_ptr == ' ') ; 		/* skip spaces */
 | 
				
			||||||
	  if (*cmd_ptr == '\0') break;		/* no arg following */
 | 
						  if (*cmd_ptr == '\0') break;		/* no arg following */
 | 
				
			||||||
	  if (arg_count>MAX_NR_ARGS+1) break;	/* arg vector full */
 | 
						  /* There are ARGV_ELEMENTS elements; must leave one for null */
 | 
				
			||||||
 | 
						  if (arg_count>=ARGV_ELEMENTS-1) {	/* arg vector full */
 | 
				
			||||||
 | 
							printf("RS: build_cmd_dep: too many args\n");
 | 
				
			||||||
 | 
						  	break;
 | 
				
			||||||
 | 
						  }
 | 
				
			||||||
 | 
						  assert(arg_count < ARGV_ELEMENTS);
 | 
				
			||||||
          rp->r_argv[arg_count++] = cmd_ptr;	/* add to arg vector */
 | 
					          rp->r_argv[arg_count++] = cmd_ptr;	/* add to arg vector */
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      cmd_ptr ++;				/* continue parsing */
 | 
					      cmd_ptr ++;				/* continue parsing */
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					  assert(arg_count < ARGV_ELEMENTS);
 | 
				
			||||||
  rp->r_argv[arg_count] = NULL;			/* end with NULL pointer */
 | 
					  rp->r_argv[arg_count] = NULL;			/* end with NULL pointer */
 | 
				
			||||||
  rp->r_argc = arg_count;
 | 
					  rp->r_argc = arg_count;
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
 | 
				
			|||||||
@ -50,7 +50,8 @@ struct rproc {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  char r_cmd[MAX_COMMAND_LEN];	/* raw command plus arguments */
 | 
					  char r_cmd[MAX_COMMAND_LEN];	/* raw command plus arguments */
 | 
				
			||||||
  char r_args[MAX_COMMAND_LEN];	/* null-separated raw command plus arguments */
 | 
					  char r_args[MAX_COMMAND_LEN];	/* null-separated raw command plus arguments */
 | 
				
			||||||
  char *r_argv[MAX_NR_ARGS+2];  /* parsed arguments vector */
 | 
					#define ARGV_ELEMENTS (MAX_NR_ARGS+2) /* path, args, null */
 | 
				
			||||||
 | 
					  char *r_argv[ARGV_ELEMENTS];
 | 
				
			||||||
  int r_argc;  			/* number of arguments */
 | 
					  int r_argc;  			/* number of arguments */
 | 
				
			||||||
  char r_script[MAX_SCRIPT_LEN]; /* name of the restart script executable */
 | 
					  char r_script[MAX_SCRIPT_LEN]; /* name of the restart script executable */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user