Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 19 Jan 2016 21:35:10 +0000 (UTC)
From:      Ian Lepore <ian@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   svn commit: r294343 - stable/10/lib/libstand
Message-ID:  <201601192135.u0JLZAuf044042@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ian
Date: Tue Jan 19 21:35:09 2016
New Revision: 294343
URL: https://svnweb.freebsd.org/changeset/base/294343

Log:
  MFC r292583:
  
    Allow dhcp/bootp server-provided values to be overriden from environment
    variables in loader(8) and other libstand applications.
  
    Sometimes a dhcp server provides incorrect information along with the IP
    address. It would be useful to have a way to override this with
    locally-supplied information, such as command line parameters passed from a
    prior-stage bootloader. This change allows pre-existing env vars to take
    precedence over values delivered by the dhcp or bootp server.
  
    The bootp/dhcp code in libstand automatically creates environment variables
    from the data provided by the server (dhcp.root-path, dhcp.domain-name,
    etc). It also transcribes the values to some global variables such as
    'rootpath' and 'hostname'.
  
    This change does two things:
  
        When adding dhcp.* vars to the environment, don't replace existing
        vars/values.
  
        When setting the global vars rootpath and hostname, use the
        dhcp.root-path and dhcp.host-name env var values if they exist.
  
    This allows the platform-specific part of loader(8) to obtain override
    values in some platform-specific way and store them in the environment
    before opening the network device. The set of values that can be overriden
    is currently limited to just string options. The values that are delivered
    as binary data are things that probably shouldn't be overridden (IP,
    netmask, gateway, etc).
  
    The original patch this evolved from was submitted by martymac@
  
  PR:           202098
  Relnotes:	Yes

Modified:
  stable/10/lib/libstand/bootp.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/lib/libstand/bootp.c
==============================================================================
--- stable/10/lib/libstand/bootp.c	Tue Jan 19 21:27:25 2016	(r294342)
+++ stable/10/lib/libstand/bootp.c	Tue Jan 19 21:35:09 2016	(r294343)
@@ -354,6 +354,7 @@ vend_rfc1048(cp, len)
 	u_char *ep;
 	int size;
 	u_char tag;
+	const char *val;
 
 #ifdef BOOTP_DEBUG
 	if (debug)
@@ -380,15 +381,17 @@ vend_rfc1048(cp, len)
 		}
 		if (tag == TAG_SWAPSERVER) {
 			/* let it override bp_siaddr */
-			bcopy(cp, &rootip.s_addr, sizeof(swapip.s_addr));
+			bcopy(cp, &rootip.s_addr, sizeof(rootip.s_addr));
 		}
 		if (tag == TAG_ROOTPATH) {
-			strncpy(rootpath, (char *)cp, sizeof(rootpath));
-			rootpath[size] = '\0';
+			if ((val = getenv("dhcp.root-path")) == NULL)
+				val = (const char *)cp;
+			strlcpy(rootpath, val, sizeof(rootpath));
 		}
 		if (tag == TAG_HOSTNAME) {
-			strncpy(hostname, (char *)cp, sizeof(hostname));
-			hostname[size] = '\0';
+			if ((val = getenv("dhcp.host-name")) == NULL)
+				val = (const char *)cp;
+			strlcpy(hostname, val, sizeof(hostname));
 		}
 #ifdef SUPPORT_DHCP
 		if (tag == TAG_DHCP_MSGTYPE) {
@@ -730,7 +733,11 @@ setenv_(u_char *cp,  u_char *ep, struct 
 		sprintf(env, op->desc, opts[0].desc, tag);
 	    else
 		sprintf(env, "%s%s", opts[0].desc, op->desc);
-	    setenv(env, buf, 1);
+	    /*
+	     * Do not replace existing values in the environment, so that
+	     * locally-obtained values can override server-provided values.
+	     */
+	    setenv(env, buf, 0);
 	}
     }
     if (tp != tags) {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201601192135.u0JLZAuf044042>