34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz/***********************************************************************
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz* *
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz* This software is part of the ast package *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* Copyright (c) 1982-2010 AT&T Intellectual Property *
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz* and is licensed under the *
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz* Common Public License, Version 1.0 *
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz* by AT&T Intellectual Property *
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz* *
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz* A copy of the License is available at *
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz* http://www.opensource.org/licenses/cpl1.0.txt *
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz* *
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz* Information and Software Systems Research *
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz* AT&T Research *
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz* Florham Park NJ *
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz* *
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz* David Korn <dgk@research.att.com> *
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz* *
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz***********************************************************************/
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#pragma prototyped
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz/*
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz * regression test intercept control
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz * enable with SHOPT_REGRESS==1 in Makefile
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz * not for production use
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz * see --man for details
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz * all string constants inline here instead of in data/...
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz *
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz * David Korn
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz * at&t research
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz */
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#include "defs.h"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#if SHOPT_REGRESS
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#include <error.h>
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#include <ls.h>
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#include "io.h"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#include "builtins.h"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#include <tmx.h>
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#define REGRESS_HEADER "ksh:REGRESS:"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#define TRACE(r,i,f) sh_regress(REGRESS_##r, i, sfprints f, __LINE__, __FILE__)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzstatic const char usage[] =
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz"[-1p0?\n@(#)$Id: __regress__ (AT&T Research) 2009-03-29 $\n]"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland MainzUSAGE_LICENSE
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz"[+NAME?__regress__ - shell regression test intercept control]"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz"[+DESCRIPTION?\b__regress__\b controls the regression test intercepts "
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "for shells compiled with SHOPT_REGRESS==1. Shells compiled this way are "
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "for testing only. In addition to \b__regress__\b and the \b--regress\b "
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "command line option, these shells may contain system library function "
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "intercepts that behave different from the native counterparts.]"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz"[+?Each option controls a different test and possibly a different set "
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "of intercepts. The options are interpreted \bdd\b(1) style -- '-' or "
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "'--' prefix not required. This simplifies the specification of the "
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "command line \b--regress\b=\avalue\a option, where \avalue\a is passed "
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "as an option to the \b__regress__\b builtin. Typically regression test "
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "intercepts are enabled with one or more command line \b--regress\b "
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "options, with optional specific calls to \b__regress__\b in test "
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "scripts to enable/disable intercepts as the test progresses.]"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz"[+?Each enabled intercept may result in trace lines of the form \b" REGRESS_HEADER
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "\aoption\a:\aintercept\a:\ainfo\a on the standard error, where "
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "\aoption\a is one of the options below, \aintercept\a is the name of "
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "the specific intercept for \aoption\a, and \ainfo\a is \aoption\a "
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "specific information. Unless noted otherwise, one regression test trace "
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "line is produced each time an enabled intercept is called.]"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz"[101:egid?The intercept effective gid is set to \aoriginal-egid\a. The "
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "effective gid of the underlying system process is not affected. The "
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "trace line info is either \begid==rgid\b or \begid!=rgid\b. The "
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "intercepts are:]#?[original-egid:=1]"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "{"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "[+getegid()?The intercept effecive gid is returned. The "
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "\bsetgid\b() intercept may change this between the real gid and "
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "\aoriginal-egid\a.]"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "[+setgid(gid)?Sets the intercept effective gid to \agid\a. "
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "Fails if \agid\a is neither the real gid nor "
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "\aoriginal-egid\a.]"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "}"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz"[102:euid?The intercept effective uid is set to \aoriginal-euid\a. The "
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "effective uid of the underlying system process is not affected. The "
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "trace line info is either \beuid==ruid\b or \beuid!=ruid\b. The "
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "intercepts are:]#?[original-euid:=1]"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "{"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "[+geteuid()?The intercept effecive uid is returned. The "
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "\bsetuid\b() intercept may change this between the real uid and "
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "\aoriginal-euid\a.]"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "[+setuid(uid)?Sets the intercept effective uid to \auid\a. "
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "Fails if \auid\a is neither the real uid nor "
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "\aoriginal-euid\a.]"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "}"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz"[103:p_suid?Specifies a value for SHOPT_P_SUID. Effective uids greater "
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "than the non-privileged-uid disable the priveleged mode. The intercepts "
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "are:]#?[non-privileged-uid:=1]"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "{"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "[+SHOPT_P_SUID?The SHOPT_P_SUID macro value is overridden by "
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "\bp_suid\b. A trace line is output for each SHOPT_P_SUID "
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "access.]"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "}"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz"[104:source?The intercepts are:]"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "{"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "[+sh_source()?The trace line info is the path of the script "
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "being sourced. Used to trace shell startup scripts.]"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "}"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz"[105:etc?Map file paths matching \b/etc/\b* to \aetc-dir\a/*. The "
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "intercepts are:]:[etc-dir:=/etc]"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "{"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "[+sh_open()?Paths matching \b/etc/\b* are changed to "
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "\aetc-dir\a/*.]"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "}"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz"[+SEE ALSO?\bksh\b(1), \bregress\b(1), \brt\b(1)]"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzstatic const char* regress_options[] =
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz{
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "ERROR",
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "egid",
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "euid",
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "p_suid",
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "source",
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz "etc",
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz};
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzvoid sh_regress_init(Shell_t* shp)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz{
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz static Regress_t state;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz shp->regress = &state;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz}
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz/*
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz * regress info trace output
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz */
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzvoid sh_regress(unsigned int index, const char* intercept, const char* info, unsigned int line, const char* file)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz{
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz char* name;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz char buf[16];
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (index >= 1 && index <= elementsof(regress_options))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz name = (char*)regress_options[index];
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz else
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz sfsprintf(name = buf, sizeof(buf), "%u", index);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz sfprintf(sfstderr, REGRESS_HEADER "%s:%s:%s\n", name, intercept, fmtesc(info));
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz}
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz/*
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz * egid intercepts
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz */
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzstatic gid_t intercept_sgid = 0;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzstatic gid_t intercept_egid = -1;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzstatic gid_t intercept_rgid = -1;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzgid_t getegid(void)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz{
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (intercept_rgid == -1)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz intercept_rgid = getgid();
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (sh_isregress(REGRESS_egid))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz TRACE(egid, "getegid", ("%s", intercept_egid == intercept_rgid ? "egid==rgid" : "egid!=rgid"));
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz return intercept_egid;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz return intercept_rgid;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz}
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzint setgid(gid_t gid)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz{
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (intercept_rgid == -1)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz intercept_rgid = getgid();
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (sh_isregress(REGRESS_egid))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (gid != intercept_rgid && gid != intercept_sgid)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz TRACE(egid, "setgid", ("%s", "EPERM"));
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz errno = EPERM;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz return -1;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz intercept_egid = gid;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz TRACE(egid, "setgid", ("%s", intercept_egid == intercept_rgid ? "egid==rgid" : "egid!=rgid"));
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz else if (gid != intercept_rgid)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz errno = EPERM;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz return -1;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz return 0;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz}
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz/*
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz * euid intercepts
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz */
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzstatic uid_t intercept_suid = 0;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzstatic uid_t intercept_euid = -1;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzstatic uid_t intercept_ruid = -1;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzuid_t geteuid(void)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz{
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (intercept_ruid == -1)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz intercept_ruid = getuid();
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (sh_isregress(REGRESS_euid))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz TRACE(euid, "geteuid", ("%s", intercept_euid == intercept_ruid ? "euid==ruid" : "euid!=ruid"));
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz return intercept_euid;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz return intercept_ruid;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz}
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzint setuid(uid_t uid)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz{
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (intercept_ruid == -1)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz intercept_ruid = getuid();
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (sh_isregress(REGRESS_euid))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (uid != intercept_ruid && uid != intercept_suid)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz TRACE(euid, "setuid", ("%s", "EPERM"));
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz errno = EPERM;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz return -1;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz intercept_euid = uid;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz TRACE(euid, "setuid", ("%s", intercept_euid == intercept_ruid ? "euid==ruid" : "euid!=ruid"));
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz else if (uid != intercept_ruid)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz errno = EPERM;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz return -1;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz return 0;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz}
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz/*
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz * p_suid intercept
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz */
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzstatic uid_t intercept_p_suid = 0x7fffffff;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzuid_t sh_regress_p_suid(unsigned int line, const char* file)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz{
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz REGRESS(p_suid, "SHOPT_P_SUID", ("%d", intercept_p_suid));
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz return intercept_p_suid;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz}
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz/*
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz * p_suid intercept
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz */
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzstatic char* intercept_etc = 0;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzchar* sh_regress_etc(const char* path, unsigned int line, const char* file)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz{
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz REGRESS(etc, "sh_open", ("%s => %s%s", path, intercept_etc, path+4));
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz return intercept_etc;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz}
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz/*
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz * __regress__ builtin
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz */
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzint b___regress__(int argc, char** argv, void *extra)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz{
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz register Shell_t* shp = ((Shbltin_t*)extra)->shp;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz int n;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz for (;;)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz switch (n = optget(argv, usage))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz case '?':
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz errormsg(SH_DICT, ERROR_usage(2), "%s", opt_info.arg);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz break;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz case ':':
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz errormsg(SH_DICT, 2, "%s", opt_info.arg);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz break;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz case 0:
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz break;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz default:
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (n < -100)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz n = -(n + 100);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (opt_info.arg || opt_info.number)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz sh_onregress(n);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz else
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz sh_offregress(n);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz switch (n)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz case REGRESS_egid:
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (sh_isregress(n))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz intercept_egid = intercept_sgid = (gid_t)opt_info.number;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz TRACE(egid, argv[0], ("%d", intercept_egid));
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz else
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz TRACE(egid, argv[0], ("%s", "off"));
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz break;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz case REGRESS_euid:
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (sh_isregress(n))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz intercept_euid = intercept_suid = (uid_t)opt_info.number;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz TRACE(euid, argv[0], ("%d", intercept_euid));
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz else
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz TRACE(euid, argv[0], ("%s", "off"));
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz break;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz case REGRESS_p_suid:
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (sh_isregress(n))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz intercept_p_suid = (uid_t)opt_info.number;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz TRACE(p_suid, argv[0], ("%d", intercept_p_suid));
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz else
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz TRACE(p_suid, argv[0], ("%s", "off"));
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz break;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz case REGRESS_source:
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz TRACE(source, argv[0], ("%s", sh_isregress(n) ? "on" : "off"));
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz break;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz case REGRESS_etc:
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (sh_isregress(n))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz intercept_etc = opt_info.arg;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz TRACE(etc, argv[0], ("%s", intercept_etc));
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz else
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz TRACE(etc, argv[0], ("%s", "off"));
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz break;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz continue;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz break;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (error_info.errors || *(argv + opt_info.index))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz errormsg(SH_DICT, ERROR_usage(2), "%s", optusage(NiL));
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz return 0;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz}
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#else
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland MainzNoN(regress)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#endif