NOTE: this is the second version of this patch.

Apply by doing:
	cd /usr/src/usr.sbin/bootpd
	patch < bootpd.patch

make && make install

Index: bootpd.c
===================================================================
RCS file: /cvs/src/usr.sbin/bootpd/bootpd.c,v
retrieving revision 1.4
diff -u -r1.4 bootpd.c
--- bootpd.c	1998/06/07 06:04:25	1.4
+++ bootpd.c	1998/12/20 21:46:09
@@ -609,11 +609,17 @@
 	int32 bootsize = 0;
 	unsigned hlen, hashcode;
 	int32 dest;
-	char realpath[1024];
+	char realpath[MAXPATHLEN];
 	char *clntpath;
 	char *homedir, *bootfile;
 	int n;
 
+	/*
+	 * Force C strings in packet to be NUL-terminated.
+	 */
+	bp->bp_sname[BP_SNAME_LEN-1] = '\0';
+	bp->bp_file[BP_FILE_LEN-1] = '\0';
+
 	/* XXX - SLIP init: Set bp_ciaddr = recv_addr here? */
 
 	/*
@@ -635,6 +641,15 @@
 		strcpy(bp->bp_sname, hostname);
 	}
 
+	/* If it uses an unknown network type, ignore the request.  */
+	if (bp->bp_htype >= hwinfocnt) {
+		if (debug)
+			report(LOG_INFO,
+			    "Request with unknown network type %u",
+			    bp->bp_htype);
+		return;
+	}
+
 	/* Convert the request into a reply. */
 	bp->bp_op = BOOTREPLY;
 	if (bp->bp_ciaddr.s_addr == 0) {
@@ -740,11 +755,9 @@
 	/* Run a program, passing the client name as a parameter. */
 	if (hp->flags.exec_file) {
 		char tst[100];
-		/* XXX - Check string lengths? -gwr */
-		strcpy (tst, hp->exec_file->string);
-		strcat (tst, " ");
-		strcat (tst, hp->hostname->string);
-		strcat (tst, " &");
+
+		snprintf(tst, sizeof(tst), "%s %s &", hp->exec_file->string,
+		    hp->hostname->string);
 		if (debug)
 			report(LOG_INFO, "executing %s", tst);
 		system(tst);	/* Hope this finishes soon... */
Index: bootptest.c
===================================================================
RCS file: /cvs/src/usr.sbin/bootpd/bootptest.c,v
retrieving revision 1.2
diff -u -r1.2 bootptest.c
--- bootptest.c	1996/08/22 10:56:14	1.2
+++ bootptest.c	1998/12/20 21:46:35
@@ -481,7 +481,7 @@
 	u_char *p;
 
 	p = (u_char *) ina;
-	sprintf(b, "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
+	snprintf(b, sizeof(b), "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
 	return (b);
 }
 
Index: getether.c
===================================================================
RCS file: /cvs/src/usr.sbin/bootpd/getether.c,v
retrieving revision 1.3
diff -u -r1.3 getether.c
--- getether.c	1997/02/17 09:11:15	1.3
+++ getether.c	1998/12/20 21:46:49
@@ -185,7 +185,7 @@
 	char *enaddr;
 	int unit = -1;				/* which unit to attach */
 
-	sprintf(devname, "/dev/%s", ifname);
+	snprintf(devname, sizeof(devname), "/dev/%s", ifname);
 	fd = open(devname, 2);
 	if (fd < 0) {
 		/* Try without the trailing digit. */
Index: hwaddr.c
===================================================================
RCS file: /cvs/src/usr.sbin/bootpd/hwaddr.c,v
retrieving revision 1.3
diff -u -r1.3 hwaddr.c
--- hwaddr.c	1997/07/04 21:15:44	1.3
+++ hwaddr.c	1998/12/20 21:47:29
@@ -134,7 +134,7 @@
 	extern char *inet_ntoa();
 
 	a = inet_ntoa(*ia);
-	sprintf(buf, "arp -d %s; arp -s %s %s temp",
+	snprintf(buf, sizeof(buf), "arp -d %s; arp -s %s %s temp",
 		a, a, haddrtoa(ha, len));
 	if (debug > 2)
 		report(LOG_INFO, buf);
@@ -162,7 +162,8 @@
 
 	bufptr = haddrbuf;
 	while (hlen > 0) {
-		sprintf(bufptr, "%02X:", (unsigned) (*haddr++ & 0xFF));
+		snprintf(bufptr, sizeof(haddrbuf) - (bufptr - haddrbuf),
+		    "%02X:", (unsigned) (*haddr++ & 0xFF));
 		bufptr += 3;
 		hlen--;
 	}
Index: readfile.c
===================================================================
RCS file: /cvs/src/usr.sbin/bootpd/readfile.c,v
retrieving revision 1.2
diff -u -r1.2 readfile.c
--- readfile.c	1996/06/23 10:22:26	1.2
+++ readfile.c	1998/12/20 21:47:43
@@ -819,7 +819,7 @@
 	if ((*symbol)[0] == 'T') {	/* generic symbol */
 		(*symbol)++;
 		value = get_u_long(symbol);
-		sprintf(current_tagname, "T%d", value);
+		snprintf(current_tagname, sizeof(current_tagname), "T%d", value);
 		eat_whitespace(symbol);
 		if ((*symbol)[0] != '=') {
 			return E_SYNTAX_ERROR;
Index: report.c
===================================================================
RCS file: /cvs/src/usr.sbin/bootpd/report.c,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 report.c
--- report.c	1995/10/18 08:47:27	1.1.1.1
+++ report.c	1998/12/20 21:46:09
@@ -101,7 +101,7 @@
 #endif
 {
 	va_list ap;
-	static char buf[128];
+	static char buf[256];
 
 	if ((priority < 0) || (priority >= numlevels)) {
 		priority = numlevels - 1;
@@ -111,7 +111,7 @@
 #else
 	va_start(ap);
 #endif
-	vsprintf(buf, fmt, ap);
+	vsnprintf(buf, sizeof(buf), fmt, ap);
 	va_end(ap);
 
 	/*
