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>

@@ -19,10 +19,11 @@
  * CDDL HEADER END
  */
 
 /*
  * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright 2015 Joyent, Inc.
  * Copyright 2016 Argo Technologie SA.
  */
 
 /*
  * Contains DB walker functions, which are of type `db_wfunc_t';

@@ -382,17 +383,22 @@
 /* ARGSUSED */
 static void *
 ipmgmt_db_restore_thread(void *arg)
 {
         int err;
+        char confpath[MAXPATHLEN];
+        char tmpconfpath[MAXPATHLEN];
 
+        ipmgmt_path(IPADM_PATH_DB, confpath, sizeof (confpath));
+        ipmgmt_path(IPADM_PATH_VOL_DB, tmpconfpath, sizeof (tmpconfpath));
+
         for (;;) {
                 (void) sleep(5);
                 (void) pthread_rwlock_wrlock(&ipmgmt_dbconf_lock);
                 if (!ipmgmt_rdonly_root)
                         break;
-                err = ipmgmt_cpfile(IPADM_VOL_DB_FILE, IPADM_DB_FILE, B_FALSE);
+                err = ipmgmt_cpfile(tmpconfpath, confpath, B_FALSE);
                 if (err == 0) {
                         ipmgmt_rdonly_root = B_FALSE;
                         break;
                 }
                 (void) pthread_rwlock_unlock(&ipmgmt_dbconf_lock);

@@ -420,11 +426,16 @@
         int             err;
         boolean_t       writeop;
         mode_t          mode;
         pthread_t       tid;
         pthread_attr_t  attr;
+        char            confpath[MAXPATHLEN];
+        char            tmpconfpath[MAXPATHLEN];
 
+        ipmgmt_path(IPADM_PATH_DB, confpath, sizeof (confpath));
+        ipmgmt_path(IPADM_PATH_VOL_DB, tmpconfpath, sizeof (tmpconfpath));
+
         writeop = (db_op != IPADM_DB_READ);
         if (writeop) {
                 (void) pthread_rwlock_wrlock(&ipmgmt_dbconf_lock);
                 mode = IPADM_FILE_MODE;
         } else {

@@ -432,46 +443,45 @@
                 mode = 0;
         }
 
         /*
          * Did a previous write attempt fail? If so, don't even try to
-         * read/write to IPADM_DB_FILE.
+         * read/write to the permanent configuration file.
          */
         if (!ipmgmt_rdonly_root) {
-                err = ipadm_rw_db(db_walk_func, db_warg, IPADM_DB_FILE,
-                    mode, db_op);
+                err = ipadm_rw_db(db_walk_func, db_warg, confpath, mode, db_op);
                 if (err != EROFS)
                         goto done;
         }
 
         /*
          * If we haven't already copied the file to the volatile
          * file system, do so. This should only happen on a failed
-         * writeop(i.e., we have acquired the write lock above).
+         * writeop (i.e., we have acquired the write lock above).
          */
-        if (access(IPADM_VOL_DB_FILE, F_OK) != 0) {
+        if (access(tmpconfpath, F_OK) != 0) {
                 assert(writeop);
-                err = ipmgmt_cpfile(IPADM_DB_FILE, IPADM_VOL_DB_FILE, B_TRUE);
+                err = ipmgmt_cpfile(confpath, tmpconfpath, B_TRUE);
                 if (err != 0)
                         goto done;
                 (void) pthread_attr_init(&attr);
                 (void) pthread_attr_setdetachstate(&attr,
                     PTHREAD_CREATE_DETACHED);
                 err = pthread_create(&tid, &attr, ipmgmt_db_restore_thread,
                     NULL);
                 (void) pthread_attr_destroy(&attr);
                 if (err != 0) {
-                        (void) unlink(IPADM_VOL_DB_FILE);
+                        (void) unlink(tmpconfpath);
                         goto done;
                 }
                 ipmgmt_rdonly_root = B_TRUE;
         }
 
         /*
          * Read/write from the volatile copy.
          */
-        err = ipadm_rw_db(db_walk_func, db_warg, IPADM_VOL_DB_FILE,
+        err = ipadm_rw_db(db_walk_func, db_warg, tmpconfpath,
             mode, db_op);
 done:
         (void) pthread_rwlock_unlock(&ipmgmt_dbconf_lock);
         return (err);
 }

@@ -1235,28 +1245,31 @@
 ipmgmt_persist_aobjmap(ipmgmt_aobjmap_t *nodep, ipadm_db_op_t op)
 {
         int                     err;
         ipadm_dbwrite_cbarg_t   cb;
         nvlist_t                *nvl = NULL;
+        char                    aobjpath[MAXPATHLEN];
 
+        ipmgmt_path(IPADM_PATH_ADDROBJ_MAP_DB, aobjpath, sizeof (aobjpath));
+
         if (op == IPADM_DB_WRITE) {
                 if ((err = i_ipmgmt_node2nvl(&nvl, nodep)) != 0)
                         return (err);
                 cb.dbw_nvl = nvl;
                 if (nodep->am_atype == IPADM_ADDR_IPV6_ADDRCONF)
                         cb.dbw_flags = IPMGMT_ATYPE_V6ACONF;
                 else
                         cb.dbw_flags = 0;
 
-                err = ipadm_rw_db(ipmgmt_update_aobjmap, &cb,
-                    ADDROBJ_MAPPING_DB_FILE, IPADM_FILE_MODE, IPADM_DB_WRITE);
+                err = ipadm_rw_db(ipmgmt_update_aobjmap, &cb, aobjpath,
+                    IPADM_FILE_MODE, IPADM_DB_WRITE);
                 nvlist_free(nvl);
         } else {
                 assert(op == IPADM_DB_DELETE);
 
-                err = ipadm_rw_db(ipmgmt_delete_aobjmap, nodep,
-                    ADDROBJ_MAPPING_DB_FILE, IPADM_FILE_MODE, IPADM_DB_DELETE);
+                err = ipadm_rw_db(ipmgmt_delete_aobjmap, nodep, aobjpath,
+                    IPADM_FILE_MODE, IPADM_DB_DELETE);
         }
         return (err);
 }
 
 /*