Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 3 Jul 2013 22:05:37 +0000 (UTC)
From:      Pawel Jakub Dawidek <pjd@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r252623 - head/sbin/dhclient
Message-ID:  <201307032205.r63M5biV034891@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: pjd
Date: Wed Jul  3 22:05:36 2013
New Revision: 252623
URL: http://svnweb.freebsd.org/changeset/base/252623

Log:
  MFp4 @229477:
  
  The gethostname(3) function won't work in capability mode, because reading
  kern.hostname sysctl is not permitted there.  Cache hostname early and use
  cached value later.
  
  Reviewed by:	brooks
  Sponsored by:	The FreeBSD Foundation

Modified:
  head/sbin/dhclient/dhclient.c

Modified: head/sbin/dhclient/dhclient.c
==============================================================================
--- head/sbin/dhclient/dhclient.c	Wed Jul  3 22:04:35 2013	(r252622)
+++ head/sbin/dhclient/dhclient.c	Wed Jul  3 22:05:36 2013	(r252623)
@@ -91,6 +91,8 @@ int log_perror = 1;
 int privfd;
 int nullfd = -1;
 
+char hostname[_POSIX_HOST_NAME_MAX + 1];
+
 struct iaddr iaddr_broadcast = { 4, { 255, 255, 255, 255 } };
 struct in_addr inaddr_any, inaddr_broadcast;
 
@@ -446,6 +448,13 @@ main(int argc, char *argv[])
 			error("no such user: nobody");
 	}
 
+	/*
+	 * Obtain hostname before entering capability mode - it won't be
+	 * possible then, as reading kern.hostname is not permitted.
+	 */
+	if (gethostname(hostname, sizeof(hostname)) < 0)
+		hostname[0] = '\0';
+
 	if (pipe(pipe_fd) == -1)
 		error("pipe");
 
@@ -1525,9 +1534,8 @@ make_discover(struct interface_info *ip,
 		}
 
 	/* send host name if not set via config file. */
-	char hostname[_POSIX_HOST_NAME_MAX+1];
 	if (!options[DHO_HOST_NAME]) {
-		if (gethostname(hostname, sizeof(hostname)) == 0) {
+		if (hostname[0] != '\0') {
 			size_t len;
 			char* posDot = strchr(hostname, '.');
 			if (posDot != NULL)
@@ -1649,9 +1657,8 @@ make_request(struct interface_info *ip, 
 		}
 
 	/* send host name if not set via config file. */
-	char hostname[_POSIX_HOST_NAME_MAX+1];
 	if (!options[DHO_HOST_NAME]) {
-		if (gethostname(hostname, sizeof(hostname)) == 0) {
+		if (hostname[0] != '\0') {
 			size_t len;
 			char* posDot = strchr(hostname, '.');
 			if (posDot != NULL)



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