--- chkutmp.c 2009-08-24 15:16:40.000000000 +0000 +++ chkutmp.c 2009-08-24 17:08:38.000000000 +0000 @@ -23,6 +23,7 @@ * * Changelog: * Ighighi X - Improved speed via break command - 2005/03/27 + * Stewart Gebbie - fixed buffer overrun bug related to MAXREAD and UT_PIDLENGTH - 2007-10-20 * Some overflow fixes by Michael Schwendt - 2009/07/21 * */ @@ -43,7 +44,7 @@ #endif #include -#define MAXREAD 1024 +#define MAXREAD 4096 #define MAXBUF 4096 #define MAXLENGTH 256 #define UT_PIDSIZE 12 @@ -58,13 +59,13 @@ #endif struct ps_line { - char ps_tty[UT_LINESIZE]; - char ps_user[UT_NAMESIZE]; - char ps_args[MAXLENGTH]; + char ps_tty[UT_LINESIZE+1]; + char ps_user[UT_NAMESIZE+1]; + char ps_args[MAXLENGTH+1]; int ps_pid; }; struct utmp_line { - char ut_tty[UT_LINESIZE]; + char ut_tty[UT_LINESIZE+1]; int ut_pid; int ut_type; }; @@ -78,7 +79,7 @@ int fetchps(struct ps_line *psl_p) { FILE *ps_fp; - char line[MAXREAD + 1], pid[UT_PIDSIZE]; + char line[MAXREAD + 1], pid[UT_PIDSIZE+1]; char *s, *d; struct ps_line *curp = &psl_p[0]; struct ps_line *endp = &psl_p[MAXBUF-1]; @@ -98,7 +99,7 @@ while (isspace(*s)) /* skip spaces */ s++; d = pid; - for (x = 0; (!isspace(*s)) && (*d++ = *s++) && x <= UT_LINESIZE; x++) /* grab pid */ + for (x = 0; (!isspace(*s)) && (*d++ = *s++) && x <= UT_PIDSIZE; x++) /* grab pid */ ; *d = '\0'; curp->ps_pid = atoi(pid);