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)
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to