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);
/*