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.