Synopsis: Remote Buffer Overflow Vulnerability in BSD Line Printer Daemon
NetBSD versions: 1.4, 1.4.1, 1.4.2, 1.4.3, 1.5, 1.5.1, 1.5.2, -current
Thanks to: Jun-ichiro Hagino
Reported in NetBSD Security Advisory: NetBSD-SA2001-018

Index: displayq.c
===================================================================
RCS file: /cvsroot/basesrc/usr.sbin/lpr/common_source/displayq.c,v
retrieving revision 1.20
retrieving revision 1.21
diff -c -p -r1.20 -r1.21
*** displayq.c	2001/06/25 11:04:52	1.20
--- displayq.c	2001/08/30 00:51:50	1.21
*************** extern int	users;		/* # of users in user
*** 76,83 ****
  extern uid_t	uid, euid;
  
  static int	col;		/* column on screen */
! static char	current[40];	/* current file being printed */
! static char	file[132];	/* print file name */
  static int	first;		/* first file in ``files'' column? */
  static int	garbage;	/* # of garbage cf files */
  static int	lflag;		/* long output option */
--- 76,83 ----
  extern uid_t	uid, euid;
  
  static int	col;		/* column on screen */
! static char	current[MAXPATHLEN]; /* current file being printed */
! static char	file[MAXPATHLEN]; /* print file name */
  static int	first;		/* first file in ``files'' column? */
  static int	garbage;	/* # of garbage cf files */
  static int	lflag;		/* long output option */
*************** displayq(format)
*** 100,106 ****
  {
  	struct queue *q;
  	int i, nitems, fd, ret;
! 	char *cp;
  	struct queue **queue;
  	struct stat statb;
  	FILE *fp;
--- 100,106 ----
  {
  	struct queue *q;
  	int i, nitems, fd, ret;
! 	char *cp, *ecp;
  	struct queue **queue;
  	struct stat statb;
  	FILE *fp;
*************** displayq(format)
*** 173,180 ****
  		else {
  			/* get daemon pid */
  			cp = current;
! 			while ((i = getc(fp)) != EOF && i != '\n')
! 				*cp++ = i;
  			*cp = '\0';
  			i = atoi(current);
  			if (i <= 0) {
--- 173,183 ----
  		else {
  			/* get daemon pid */
  			cp = current;
! 			ecp = cp + sizeof(current) - 1;
! 			while ((i = getc(fp)) != EOF && i != '\n') {
! 				if (cp < ecp)
! 					*cp++ = i;
! 			}
  			*cp = '\0';
  			i = atoi(current);
  			if (i <= 0) {
*************** displayq(format)
*** 189,196 ****
  			} else {
  				/* read current file name */
  				cp = current;
! 				while ((i = getc(fp)) != EOF && i != '\n')
! 					*cp++ = i;
  				*cp = '\0';
  				/*
  				 * Print the status file.
--- 192,202 ----
  			} else {
  				/* read current file name */
  				cp = current;
! 		    		ecp = cp + sizeof(current) - 1;
! 				while ((i = getc(fp)) != EOF && i != '\n') {
! 					if (cp < ecp)
! 						*cp++ = i;
! 				}
  				*cp = '\0';
  				/*
  				 * Print the status file.
