Module Name:    src
Committed By:   roy
Date:           Wed May  6 23:56:49 UTC 2009

Modified Files:
        src/sys/lib/libsa: bootp.c

Log Message:
We should check for potential overflows.

ok: martin


To generate a diff of this commit:
cvs rdiff -u -r1.34 -r1.35 src/sys/lib/libsa/bootp.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/lib/libsa/bootp.c
diff -u src/sys/lib/libsa/bootp.c:1.34 src/sys/lib/libsa/bootp.c:1.35
--- src/sys/lib/libsa/bootp.c:1.34	Sat Jan 17 14:00:36 2009
+++ src/sys/lib/libsa/bootp.c	Wed May  6 23:56:49 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: bootp.c,v 1.34 2009/01/17 14:00:36 tsutsui Exp $	*/
+/*	$NetBSD: bootp.c,v 1.35 2009/05/06 23:56:49 roy Exp $	*/
 
 /*
  * Copyright (c) 1992 Regents of the University of California.
@@ -372,21 +372,21 @@
 		if (tag == TAG_END)
 			break;
 
-		if (tag == TAG_SUBNET_MASK) {
+		if (tag == TAG_SUBNET_MASK && size >= sizeof(smask)) {
 			(void)memcpy(&smask, cp, sizeof(smask));
 		}
-		if (tag == TAG_GATEWAY) {
+		if (tag == TAG_GATEWAY && size >= sizeof(gateip.s_addr)) {
 			(void)memcpy(&gateip.s_addr, cp, sizeof(gateip.s_addr));
 		}
-		if (tag == TAG_SWAPSERVER) {
+		if (tag == TAG_SWAPSERVER && size >= sizeof(rootip.s_addr)) {
 			/* let it override bp_siaddr */
 			(void)memcpy(&rootip.s_addr, cp, sizeof(rootip.s_addr));
 		}
-		if (tag == TAG_ROOTPATH) {
+	        if (tag == TAG_ROOTPATH && size < sizeof(rootpath)) {
 			strncpy(rootpath, (char *)cp, sizeof(rootpath));
 			rootpath[size] = '\0';
 		}
-		if (tag == TAG_HOSTNAME) {
+		if (tag == TAG_HOSTNAME && size < sizeof(hostname)) {
 			strncpy(hostname, (char *)cp, sizeof(hostname));
 			hostname[size] = '\0';
 		}
@@ -396,13 +396,15 @@
 				return -1;
 			dhcp_ok = 1;
 		}
-		if (tag == TAG_SERVERID) {
+		if (tag == TAG_SERVERID &&
+		    size >= sizeof(dhcp_serverip.s_addr))
+		{
 			(void)memcpy(&dhcp_serverip.s_addr, cp, 
 			      sizeof(dhcp_serverip.s_addr));
 		}
 #endif
 #ifdef SUPPORT_LINUX
-		if (tag == TAG_LINUX_CMDLINE) {
+		if (tag == TAG_LINUX_CMDLINE && size < sizeof(linuxcmdline)) {
 			strncpy(linuxcmdline, (char *)cp, sizeof(linuxcmdline));
 			linuxcmdline[size] = '\0';
 		}

Reply via email to