Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/cmd/3d/execve3d.c
1808 views
1
/***********************************************************************
2
* *
3
* This software is part of the ast package *
4
* Copyright (c) 1989-2011 AT&T Intellectual Property *
5
* and is licensed under the *
6
* Eclipse Public License, Version 1.0 *
7
* by AT&T Intellectual Property *
8
* *
9
* A copy of the License is available at *
10
* http://www.eclipse.org/org/documents/epl-v10.html *
11
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
12
* *
13
* Information and Software Systems Research *
14
* AT&T Research *
15
* Florham Park NJ *
16
* *
17
* Glenn Fowler <[email protected]> *
18
* David Korn <[email protected]> *
19
* Eduardo Krell <[email protected]> *
20
* *
21
***********************************************************************/
22
#pragma prototyped
23
24
#include "3d.h"
25
26
#if _hdr_alloca
27
28
#include <alloca.h>
29
30
#else
31
32
void
33
fix(void)
34
{
35
if (state.brk.beg)
36
{
37
ssize_t n;
38
39
if (state.brk.end && (n = state.brk.end - state.brk.beg) > 0)
40
{
41
memset(state.brk.beg, 0, n);
42
if ((char*)sbrk(0) == state.brk.end)
43
sbrk(-n);
44
}
45
state.brk.beg = state.brk.end = 0;
46
}
47
}
48
49
#endif
50
51
int
52
execve3d(const char* path, char* const* aargv, char* const* aarge)
53
{
54
char** argv = (char**)aargv;
55
char** arge = (char**)aarge;
56
register char* sp;
57
register char* ep;
58
register int size;
59
register int argn = 0;
60
int n;
61
char* tp;
62
char buf[PATH_MAX];
63
#if FS
64
Mount_t* mp;
65
#endif
66
67
if (!(sp = pathreal(path, 0, NiL)))
68
return(-1);
69
if (state.safe && !state.path.level)
70
{
71
errno = EPERM;
72
return(-1);
73
}
74
if (*sp == '/')
75
{
76
#if HUH920211 /* mh corrupts static state strings */
77
if (streq(sp, state.binsh)) sp = state.shell;
78
#else
79
if (streq(sp, "/bin/sh")) sp = state.shell;
80
#endif
81
}
82
else if (!state.in_2d && --sp > state.path.name) *--sp = '.';
83
sp = strncpy(buf, sp, sizeof(buf));
84
if (state.level)
85
{
86
/*
87
* make sure dot is set correctly if not top level
88
*/
89
90
pathreal(state.pwd, 0, NiL);
91
}
92
if (arge == state.env + 1) arge--;
93
else
94
{
95
register char** op = arge;
96
97
/*
98
* compute size of environment pointers
99
*/
100
101
while (*op++) argn++;
102
argn += 2;
103
argn *= sizeof(char*);
104
}
105
size = mapdump(NiL, NiL, MAP_EXEC);
106
n = size + argn + 10;
107
n = roundof(n, 32);
108
#if _hdr_alloca
109
state.brk.beg = (char*)alloca(n);
110
#else
111
state.brk.beg = (char*)sbrk(n);
112
state.brk.end = (char*)sbrk(0);
113
#endif
114
ep = state.brk.beg + argn + 10 - sizeof(var_3d) + 1;
115
tp = strcopy(ep, var_3d);
116
size = mapdump(NiL, tp, MAP_EXEC);
117
if (!keep(tp, size, 1))
118
reclaim();
119
else
120
{
121
if (argn)
122
{
123
register char** op = arge;
124
register char** np;
125
126
arge = (char**)state.brk.beg;
127
np = arge + 1;
128
while (*np++ = *op++);
129
}
130
arge[0] = ep;
131
}
132
#if FS
133
for (mp = state.global; mp; mp = mp->global)
134
{
135
if (fssys(mp, MSG_exec))
136
fscall(mp, MSG_exec, 0, sp, argv, arge);
137
if (fssys(mp, MSG_close))
138
{
139
register File_t* fp;
140
141
for (fp = state.file; fp <= state.file + state.open; fp++)
142
if ((fp->flags & FILE_OPEN) && ((fp->flags & FILE_CLOEXEC) || (size = FCNTL(fp - state.file, F_GETFD, NiL)) >= 0 && (size & FD_CLOEXEC)) && !FSTAT(fp - state.file, &state.path.st))
143
fscall(mp, MSG_close, 0, fp - state.file, state.path.st.st_mtime);
144
}
145
}
146
#endif
147
EXECVE(sp, argv, arge);
148
reclaim();
149
return(-1);
150
}
151
152