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-7
mailing list