Synopsis: sendmail(8) incorrect command line argument check leads to local root privilege hijack
NetBSD versions: 1.5, -current
Reported in NetBSD Security Advisory: NetBSD-SA2001-017

Index: trace.c
===================================================================
RCS file: /cvsroot/gnusrc/gnu/dist/sendmail/sendmail/trace.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -c -p -r1.4 -r1.5
*** trace.c	2000/10/10 11:17:48	1.4
--- trace.c	2001/08/21 07:13:26	1.5
*************** void
*** 63,69 ****
  tTflag(s)
  	register char *s;
  {
! 	int first, last;
  	register unsigned int i;
  
  	if (*s == '\0')
--- 63,69 ----
  tTflag(s)
  	register char *s;
  {
! 	unsigned int first, last;
  	register unsigned int i;
  
  	if (*s == '\0')
*************** tTflag(s)
*** 73,88 ****
  	{
  		/* find first flag to set */
  		i = 0;
! 		while (isascii(*s) && isdigit(*s))
  			i = i * 10 + (*s++ - '0');
  		first = i;
  
  		/* find last flag to set */
  		if (*s == '-')
  		{
  			i = 0;
! 			while (isascii(*++s) && isdigit(*s))
  				i = i * 10 + (*s - '0');
  		}
  		last = i;
  
--- 73,100 ----
  	{
  		/* find first flag to set */
  		i = 0;
! 		while (isascii(*s) && isdigit(*s) && i < tTsize)
  			i = i * 10 + (*s++ - '0');
+ 
+ 		/*
+ 		**  skip over rest of a too large number
+ 		**  Maybe we should complain if out-of-bounds values are used.
+ 		*/
+ 
+ 		while (isascii(*s) && isdigit(*s) && i >= tTsize)
+ 			s++;
  		first = i;
  
  		/* find last flag to set */
  		if (*s == '-')
  		{
  			i = 0;
! 			while (isascii(*++s) && isdigit(*s) && i < tTsize)
  				i = i * 10 + (*s - '0');
+ 
+ 			/* skip over rest of a too large number */
+ 			while (isascii(*s) && isdigit(*s) && i >= tTsize)
+ 				s++;
  		}
  		last = i;
  
