Print this page
OS-4335 ipadm_door_call should work in a branded zone without chroot
OS-4336 ipmgmtd should work in a branded zone without chroot
Reviewed by: Robert Mustacchi <rm@joyent.com>
OS-2837 lx brand only works with shared IP stacks
        
*** 19,28 ****
--- 19,29 ----
   * CDDL HEADER END
   */
  
  /*
   * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+  * Copyright 2015 Joyent, Inc.
   * Copyright 2014 Nexenta Systems, Inc.  All rights reserved.
   */
  
  #include <stdio.h>
  #include <stdlib.h>
*** 283,297 ****
   * interfaces.
   */
  boolean_t
  ipadm_check_auth(void)
  {
          struct passwd   pwd;
          char            buf[NSS_BUFLEN_PASSWD];
  
          /* get the password entry for the given user ID */
!         if (getpwuid_r(getuid(), &pwd, buf, sizeof (buf)) == NULL)
                  return (B_FALSE);
  
          /* check for presence of given authorization */
          return (chkauthattr(NETWORK_INTERFACE_CONFIG_AUTH, pwd.pw_name) != 0);
  }
--- 284,306 ----
   * interfaces.
   */
  boolean_t
  ipadm_check_auth(void)
  {
+         int             uid;
          struct passwd   pwd;
          char            buf[NSS_BUFLEN_PASSWD];
  
+         /*
+          * Branded zones may have different kinds of auth, but root always
+          * allowed.
+          */
+         if ((uid = getuid()) == 0)
+                 return (B_TRUE);
+ 
          /* get the password entry for the given user ID */
!         if (getpwuid_r(uid, &pwd, buf, sizeof (buf)) == NULL)
                  return (B_FALSE);
  
          /* check for presence of given authorization */
          return (chkauthattr(NETWORK_INTERFACE_CONFIG_AUTH, pwd.pw_name) != 0);
  }
*** 895,907 ****
          darg.rbuf = *rbufp;
          darg.rsize = rsize;
  
  reopen:
          (void) pthread_mutex_lock(&iph->iph_lock);
!         /* The door descriptor is opened if it isn't already */
          if (iph->iph_door_fd == -1) {
!                 if ((iph->iph_door_fd = open(IPMGMT_DOOR, O_RDONLY)) < 0) {
                          err = errno;
                          (void) pthread_mutex_unlock(&iph->iph_lock);
                          return (err);
                  }
          }
--- 904,928 ----
          darg.rbuf = *rbufp;
          darg.rsize = rsize;
  
  reopen:
          (void) pthread_mutex_lock(&iph->iph_lock);
!         /*
!          * The door descriptor is opened if it isn't already.
!          */
          if (iph->iph_door_fd == -1) {
!                 char door[MAXPATHLEN];
!                 const char *zroot = zone_get_nroot();
! 
!                 /*
!                  * If this is a branded zone, make sure we use the "/native"
!                  * prefix for the door path:
!                  */
!                 (void) snprintf(door, sizeof (door), "%s%s", zroot != NULL ?
!                     zroot : "", IPMGMT_DOOR);
! 
!                 if ((iph->iph_door_fd = open(door, O_RDONLY)) < 0) {
                          err = errno;
                          (void) pthread_mutex_unlock(&iph->iph_lock);
                          return (err);
                  }
          }