Print this page
OS-4716 lxbrand native system(3C) broken
Reviewed by: jerry.jelinek@joyent.com
Reviewed by: patrick.mooney@joyent.com

@@ -20,10 +20,11 @@
  */
 
 /*
  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
+ * Copyright 2016 Joyent, Inc.
  */
 
 /*      Copyright (c) 1988 AT&T */
 /*        All Rights Reserved   */
 

@@ -41,10 +42,11 @@
 #include <pthread.h>
 #include <errno.h>
 #include <synch.h>
 #include <spawn.h>
 #include <paths.h>
+#include <zone.h>
 #include "libc.h"
 
 extern const char **_environ;
 
 extern int __xpg4;      /* defined in _xpg4.c; 0 if not xpg4-compiled program */

@@ -123,15 +125,22 @@
         pid_t w;
         int status;
         int error;
         sigset_t mask;
         struct stat64 buf;
-        const char *shpath = _PATH_BSHELL;
+        char shpath[MAXPATHLEN];
+        const char *zroot = zone_get_nroot();
         char *argv[4];
         posix_spawnattr_t attr;
         static const char *shell = "sh";
 
+        /*
+         * If executing in brand use native root.
+         */
+        (void) snprintf(shpath, sizeof (shpath), "%s%s",
+            zroot != NULL ? zroot : "", _PATH_BSHELL);
+
         if (cmd == NULL) {
                 if (stat64(shpath, &buf) != 0) {
                         return (0);
                 } else if (getuid() == buf.st_uid) {
                         /* exec for user */