svn commit: r194235 - stable/7/sbin/dhclient

Brian Somers brian at FreeBSD.org
Mon Jun 15 07:24:18 UTC 2009


Author: brian
Date: Mon Jun 15 07:24:16 2009
New Revision: 194235
URL: http://svn.freebsd.org/changeset/base/194235

Log:
  MFC: r193765:
    Fix an off by one error when we limit append/prepend text sizes based on our
    internal buffer sizes.
  
    When we 'append', assume we're appending to text.  Some MS dhcp servers will
    give us a string with the length including the trailing NUL.  when we 'append
    domain-name', we get something like "search x.y\000 z" in resolv.conf :(

Modified:
  stable/7/sbin/dhclient/   (props changed)
  stable/7/sbin/dhclient/dhclient.c

Modified: stable/7/sbin/dhclient/dhclient.c
==============================================================================
--- stable/7/sbin/dhclient/dhclient.c	Mon Jun 15 07:17:55 2009	(r194234)
+++ stable/7/sbin/dhclient/dhclient.c	Mon Jun 15 07:24:16 2009	(r194235)
@@ -1977,7 +1977,7 @@ supersede:
 					len = ip->client->
 					    config->defaults[i].len +
 					    lease->options[i].len;
-					if (len > sizeof(dbuf)) {
+					if (len >= sizeof(dbuf)) {
 						warning("no space to %s %s",
 						    "prepend option",
 						    dhcp_options[i].name);
@@ -1996,24 +1996,34 @@ supersede:
 					dp[len] = '\0';
 					break;
 				case ACTION_APPEND:
+					/*
+					 * When we append, we assume that we're
+					 * appending to text.  Some MS servers
+					 * include a NUL byte at the end of
+					 * the search string provided.
+					 */
 					len = ip->client->
 					    config->defaults[i].len +
 					    lease->options[i].len;
-					if (len > sizeof(dbuf)) {
+					if (len >= sizeof(dbuf)) {
 						warning("no space to %s %s",
 						    "append option",
 						    dhcp_options[i].name);
 						goto supersede;
 					}
-					dp = dbuf;
-					memcpy(dp,
+					memcpy(dbuf,
 						lease->options[i].data,
 						lease->options[i].len);
-					memcpy(dp + lease->options[i].len,
+					for (dp = dbuf + lease->options[i].len;
+					    dp > dbuf; dp--, len--)
+						if (dp[-1] != '\0')
+							break;
+					memcpy(dp,
 						ip->client->
 						config->defaults[i].data,
 						ip->client->
 						config->defaults[i].len);
+					dp = dbuf;
 					dp[len] = '\0';
 				}
 			} else {


More information about the svn-src-stable mailing list