shbin.c revision ce67301fa82625f5594913e8ab6abf9e0aa461d0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * CDDL HEADER START
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * The contents of this file are subject to the terms of the
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * Common Development and Distribution License (the "License").
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * You may not use this file except in compliance with the License.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * See the License for the specific language governing permissions
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * and limitations under the License.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * When distributing Covered Code, include this CDDL HEADER in each
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * If applicable, add the following below this CDDL HEADER, with the
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * fields enclosed by brackets "[]" replaced with your own identifying
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * information: Portions Copyright [yyyy] [name of copyright owner]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * CDDL HEADER END
ce67301fa82625f5594913e8ab6abf9e0aa461d0Roland Mainz * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * Use is subject to license terms.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * This is the loadable module wrapper.
ce67301fa82625f5594913e8ab6abf9e0aa461d0Roland Mainz/* Local prototypes */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * Our list where we may find a copy of ksh93. The ordering is:
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * 1. 64bit (may not be installed or not supported in hardware)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * 3. Use /sbin/ksh93 when /usr is not available
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * ([1] and [2] explicitly bypass /usr/bin/ksh93 to avoid the
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * isaexec overhead).
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic char *shell_list[] =
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin/* Bypass /usr/bin/ksh93 (which is "isaexec") for performance */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#error "Unrecognized platform/CPU (use /usr/bin/ksh93 when in doubt)."
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * Module linkage information for the kernel.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin &mod_execops, "exec mod for shell binaries (ksh93)", &esw
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * Read the entire line and confirm that it starts with the magic
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * sequence for compiled ksh93 shell scripts.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if (error = vn_rdwr(UIO_READ, vp, linep, sizeof (linep), (offset_t)0,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if (memcmp(linep, shbinmagicstr, SHBINMAGIC_LEN) != 0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin char devfd[19]; /* 32-bit int fits in 10 digits + 8 for "/dev/fd/" */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * Check whether the executable has the correct magic value.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * Travel the list of shells and look for one which is available...
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin error = pn_get(shell_list[i], UIO_SYSSPACE, &intppn);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin error = lookuppn(&intppn, &resolvepn, FOLLOW, NULLVPP, &nvp);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin /* Found match */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin /* No match found ? Then continue with the next item... */
ce67301fa82625f5594913e8ab6abf9e0aa461d0Roland Mainz * Setup interpreter data
ce67301fa82625f5594913e8ab6abf9e0aa461d0Roland Mainz * "--" is passed to mark the end-of-arguments before adding
ce67301fa82625f5594913e8ab6abf9e0aa461d0Roland Mainz * the scripts file name, preventing problems when a
ce67301fa82625f5594913e8ab6abf9e0aa461d0Roland Mainz * a script's name starts with a '-' character.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin /* don't free resolvepn until we are done with args */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * When we're executing a set-uid script resulting in uids
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * mismatching or when we execute with additional privileges,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * we close the "replace script between exec and open by shell"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * hole by passing the script as /dev/fd parameter.