kern/119079: [patch] DDB input routine reads/writes beyond end of
buffer
Michael Plass
mfp49_freebsd at plass-family.net
Thu Dec 27 15:00:09 PST 2007
>Number: 119079
>Category: kern
>Synopsis: [patch] DDB input routine reads/writes beyond end of buffer
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Thu Dec 27 23:00:09 UTC 2007
>Closed-Date:
>Last-Modified:
>Originator: Michael Plass
>Release: FreeBSD 7.0-PRERELEASE amd64
>Organization:
PARC
>Environment:
System: FreeBSD shuttle.plass-family.net 7.0-PRERELEASE FreeBSD 7.0-PRERELEASE #20: Thu Dec 27 13:31:57 PST 2007 root at shuttle.plass-family.net:/usr/obj/usr/src/sys/FASTGENERIC amd64
>Description:
The ddb input routine db_readline() includes the terminating newline
and NUL characters in the returned buffer, but it does not take this
into account when checking against the caller-supplied limit.
>How-To-Repeat:
Enter DDB and type enough characters to fill the buffer
(120 characters). Hit enter, and then use the up-arrow key to
scroll back through history. Note that it picks up garbage past the
end of the original line.
>Fix:
The patch checks the provided lsize and decreases by two to leave
room for the newline and NUL; it also clears these two characters,
because some of the code paths don't provide the terminating NUL.
(The patch also corrects a problem in history redraw when the cursor
is not at the end of the line while scrolling back though history.)
--- db_input_bufoverflow.patch begins here ---
Index: db_input.c
===================================================================
RCS file: /home/ncvs/src/sys/ddb/db_input.c,v
retrieving revision 1.37
diff -u -3 -r1.37 db_input.c
--- db_input.c 25 Dec 2007 23:06:51 -0000 1.37
+++ db_input.c 27 Dec 2007 22:04:40 -0000
@@ -250,7 +250,7 @@
}
hist_redraw:
- db_putnchars(BACKUP, db_le - db_lbuf_start);
+ db_putnchars(BACKUP, db_lc - db_lbuf_start);
db_putnchars(BLANK, db_le - db_lbuf_start);
db_putnchars(BACKUP, db_le - db_lbuf_start);
db_le = index(db_lbuf_start, '\0');
@@ -302,6 +302,10 @@
char * lstart;
int lsize;
{
+ if (lsize < 3)
+ return (0);
+ lstart[lsize - 1] = lstart[lsize - 2] = 0;
+ lsize -= 2; /* allow space for newline and terminating NUL */
if (lsize != db_lhistlsize) {
/*
* (Re)initialize input line history. Throw away any
--- db_input_bufoverflow.patch ends here ---
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-bugs
mailing list