Line data Source code
1 : /*
2 : Unix SMB/CIFS implementation.
3 : SMB torture tester - deny mode scanning functions
4 : Copyright (C) Andrew Tridgell 2001
5 :
6 : This program is free software; you can redistribute it and/or modify
7 : it under the terms of the GNU General Public License as published by
8 : the Free Software Foundation; either version 3 of the License, or
9 : (at your option) any later version.
10 :
11 : This program is distributed in the hope that it will be useful,
12 : but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 : GNU General Public License for more details.
15 :
16 : You should have received a copy of the GNU General Public License
17 : along with this program. If not, see <http://www.gnu.org/licenses/>.
18 : */
19 :
20 : #include "includes.h"
21 : #include "system/filesys.h"
22 : #include "libcli/libcli.h"
23 : #include "libcli/security/security.h"
24 : #include "torture/util.h"
25 : #include "cxd_known.h"
26 : #include "torture/basic/proto.h"
27 :
28 : extern int torture_failures;
29 :
30 : #define CHECK_MAX_FAILURES(label) do { if (++failures >= torture_failures) goto label; } while (0)
31 :
32 : enum deny_result {A_0=0, A_X=1, A_R=2, A_W=3, A_RW=5};
33 :
34 0 : static const char *denystr(int denymode)
35 : {
36 0 : const struct {
37 : int v;
38 : const char *name;
39 0 : } deny_modes[] = {
40 : {DENY_DOS, "DENY_DOS"},
41 : {DENY_ALL, "DENY_ALL"},
42 : {DENY_WRITE, "DENY_WRITE"},
43 : {DENY_READ, "DENY_READ"},
44 : {DENY_NONE, "DENY_NONE"},
45 : {DENY_FCB, "DENY_FCB"},
46 : {-1, NULL}};
47 0 : int i;
48 0 : for (i=0;deny_modes[i].name;i++) {
49 0 : if (deny_modes[i].v == denymode) return deny_modes[i].name;
50 : }
51 0 : return "DENY_XXX";
52 : }
53 :
54 0 : static const char *openstr(int mode)
55 : {
56 0 : const struct {
57 : int v;
58 : const char *name;
59 0 : } open_modes[] = {
60 : {O_RDWR, "O_RDWR"},
61 : {O_RDONLY, "O_RDONLY"},
62 : {O_WRONLY, "O_WRONLY"},
63 : {-1, NULL}};
64 0 : int i;
65 0 : for (i=0;open_modes[i].name;i++) {
66 0 : if (open_modes[i].v == mode) return open_modes[i].name;
67 : }
68 0 : return "O_XXX";
69 : }
70 :
71 0 : static const char *resultstr(enum deny_result res)
72 : {
73 0 : const struct {
74 : enum deny_result res;
75 : const char *name;
76 0 : } results[] = {
77 : {A_X, "X"},
78 : {A_0, "-"},
79 : {A_R, "R"},
80 : {A_W, "W"},
81 : {A_RW,"RW"}};
82 0 : int i;
83 0 : for (i=0;i<ARRAY_SIZE(results);i++) {
84 0 : if (results[i].res == res) return results[i].name;
85 : }
86 0 : return "*";
87 : }
88 :
89 : static const struct {
90 : int isexe;
91 : int mode1, deny1;
92 : int mode2, deny2;
93 : enum deny_result result;
94 : } denytable2[] = {
95 : {1, O_RDWR, DENY_DOS, O_RDWR, DENY_DOS, A_RW},
96 : {1, O_RDWR, DENY_DOS, O_RDONLY, DENY_DOS, A_R},
97 : {1, O_RDWR, DENY_DOS, O_WRONLY, DENY_DOS, A_W},
98 : {1, O_RDWR, DENY_DOS, O_RDWR, DENY_ALL, A_0},
99 : {1, O_RDWR, DENY_DOS, O_RDONLY, DENY_ALL, A_0},
100 : {1, O_RDWR, DENY_DOS, O_WRONLY, DENY_ALL, A_0},
101 : {1, O_RDWR, DENY_DOS, O_RDWR, DENY_WRITE, A_0},
102 : {1, O_RDWR, DENY_DOS, O_RDONLY, DENY_WRITE, A_0},
103 : {1, O_RDWR, DENY_DOS, O_WRONLY, DENY_WRITE, A_0},
104 : {1, O_RDWR, DENY_DOS, O_RDWR, DENY_READ, A_0},
105 : {1, O_RDWR, DENY_DOS, O_RDONLY, DENY_READ, A_0},
106 : {1, O_RDWR, DENY_DOS, O_WRONLY, DENY_READ, A_0},
107 : {1, O_RDWR, DENY_DOS, O_RDWR, DENY_NONE, A_RW},
108 : {1, O_RDWR, DENY_DOS, O_RDONLY, DENY_NONE, A_R},
109 : {1, O_RDWR, DENY_DOS, O_WRONLY, DENY_NONE, A_W},
110 : {1, O_RDWR, DENY_DOS, O_RDWR, DENY_FCB, A_0},
111 : {1, O_RDWR, DENY_DOS, O_RDONLY, DENY_FCB, A_0},
112 : {1, O_RDWR, DENY_DOS, O_WRONLY, DENY_FCB, A_0},
113 : {1, O_RDONLY, DENY_DOS, O_RDWR, DENY_DOS, A_RW},
114 : {1, O_RDONLY, DENY_DOS, O_RDONLY, DENY_DOS, A_R},
115 : {1, O_RDONLY, DENY_DOS, O_WRONLY, DENY_DOS, A_W},
116 : {1, O_RDONLY, DENY_DOS, O_RDWR, DENY_ALL, A_0},
117 : {1, O_RDONLY, DENY_DOS, O_RDONLY, DENY_ALL, A_0},
118 : {1, O_RDONLY, DENY_DOS, O_WRONLY, DENY_ALL, A_0},
119 : {1, O_RDONLY, DENY_DOS, O_RDWR, DENY_WRITE, A_RW},
120 : {1, O_RDONLY, DENY_DOS, O_RDONLY, DENY_WRITE, A_R},
121 : {1, O_RDONLY, DENY_DOS, O_WRONLY, DENY_WRITE, A_W},
122 : {1, O_RDONLY, DENY_DOS, O_RDWR, DENY_READ, A_0},
123 : {1, O_RDONLY, DENY_DOS, O_RDONLY, DENY_READ, A_0},
124 : {1, O_RDONLY, DENY_DOS, O_WRONLY, DENY_READ, A_0},
125 : {1, O_RDONLY, DENY_DOS, O_RDWR, DENY_NONE, A_RW},
126 : {1, O_RDONLY, DENY_DOS, O_RDONLY, DENY_NONE, A_R},
127 : {1, O_RDONLY, DENY_DOS, O_WRONLY, DENY_NONE, A_W},
128 : {1, O_RDONLY, DENY_DOS, O_RDWR, DENY_FCB, A_0},
129 : {1, O_RDONLY, DENY_DOS, O_RDONLY, DENY_FCB, A_0},
130 : {1, O_RDONLY, DENY_DOS, O_WRONLY, DENY_FCB, A_0},
131 : {1, O_WRONLY, DENY_DOS, O_RDWR, DENY_DOS, A_RW},
132 : {1, O_WRONLY, DENY_DOS, O_RDONLY, DENY_DOS, A_R},
133 : {1, O_WRONLY, DENY_DOS, O_WRONLY, DENY_DOS, A_W},
134 : {1, O_WRONLY, DENY_DOS, O_RDWR, DENY_ALL, A_0},
135 : {1, O_WRONLY, DENY_DOS, O_RDONLY, DENY_ALL, A_0},
136 : {1, O_WRONLY, DENY_DOS, O_WRONLY, DENY_ALL, A_0},
137 : {1, O_WRONLY, DENY_DOS, O_RDWR, DENY_WRITE, A_0},
138 : {1, O_WRONLY, DENY_DOS, O_RDONLY, DENY_WRITE, A_0},
139 : {1, O_WRONLY, DENY_DOS, O_WRONLY, DENY_WRITE, A_0},
140 : {1, O_WRONLY, DENY_DOS, O_RDWR, DENY_READ, A_RW},
141 : {1, O_WRONLY, DENY_DOS, O_RDONLY, DENY_READ, A_R},
142 : {1, O_WRONLY, DENY_DOS, O_WRONLY, DENY_READ, A_W},
143 : {1, O_WRONLY, DENY_DOS, O_RDWR, DENY_NONE, A_RW},
144 : {1, O_WRONLY, DENY_DOS, O_RDONLY, DENY_NONE, A_R},
145 : {1, O_WRONLY, DENY_DOS, O_WRONLY, DENY_NONE, A_W},
146 : {1, O_WRONLY, DENY_DOS, O_RDWR, DENY_FCB, A_0},
147 : {1, O_WRONLY, DENY_DOS, O_RDONLY, DENY_FCB, A_0},
148 : {1, O_WRONLY, DENY_DOS, O_WRONLY, DENY_FCB, A_0},
149 : {1, O_RDWR, DENY_ALL, O_RDWR, DENY_DOS, A_0},
150 : {1, O_RDWR, DENY_ALL, O_RDONLY, DENY_DOS, A_0},
151 : {1, O_RDWR, DENY_ALL, O_WRONLY, DENY_DOS, A_0},
152 : {1, O_RDWR, DENY_ALL, O_RDWR, DENY_ALL, A_0},
153 : {1, O_RDWR, DENY_ALL, O_RDONLY, DENY_ALL, A_0},
154 : {1, O_RDWR, DENY_ALL, O_WRONLY, DENY_ALL, A_0},
155 : {1, O_RDWR, DENY_ALL, O_RDWR, DENY_WRITE, A_0},
156 : {1, O_RDWR, DENY_ALL, O_RDONLY, DENY_WRITE, A_0},
157 : {1, O_RDWR, DENY_ALL, O_WRONLY, DENY_WRITE, A_0},
158 : {1, O_RDWR, DENY_ALL, O_RDWR, DENY_READ, A_0},
159 : {1, O_RDWR, DENY_ALL, O_RDONLY, DENY_READ, A_0},
160 : {1, O_RDWR, DENY_ALL, O_WRONLY, DENY_READ, A_0},
161 : {1, O_RDWR, DENY_ALL, O_RDWR, DENY_NONE, A_0},
162 : {1, O_RDWR, DENY_ALL, O_RDONLY, DENY_NONE, A_0},
163 : {1, O_RDWR, DENY_ALL, O_WRONLY, DENY_NONE, A_0},
164 : {1, O_RDWR, DENY_ALL, O_RDWR, DENY_FCB, A_0},
165 : {1, O_RDWR, DENY_ALL, O_RDONLY, DENY_FCB, A_0},
166 : {1, O_RDWR, DENY_ALL, O_WRONLY, DENY_FCB, A_0},
167 : {1, O_RDONLY, DENY_ALL, O_RDWR, DENY_DOS, A_0},
168 : {1, O_RDONLY, DENY_ALL, O_RDONLY, DENY_DOS, A_0},
169 : {1, O_RDONLY, DENY_ALL, O_WRONLY, DENY_DOS, A_0},
170 : {1, O_RDONLY, DENY_ALL, O_RDWR, DENY_ALL, A_0},
171 : {1, O_RDONLY, DENY_ALL, O_RDONLY, DENY_ALL, A_0},
172 : {1, O_RDONLY, DENY_ALL, O_WRONLY, DENY_ALL, A_0},
173 : {1, O_RDONLY, DENY_ALL, O_RDWR, DENY_WRITE, A_0},
174 : {1, O_RDONLY, DENY_ALL, O_RDONLY, DENY_WRITE, A_0},
175 : {1, O_RDONLY, DENY_ALL, O_WRONLY, DENY_WRITE, A_0},
176 : {1, O_RDONLY, DENY_ALL, O_RDWR, DENY_READ, A_0},
177 : {1, O_RDONLY, DENY_ALL, O_RDONLY, DENY_READ, A_0},
178 : {1, O_RDONLY, DENY_ALL, O_WRONLY, DENY_READ, A_0},
179 : {1, O_RDONLY, DENY_ALL, O_RDWR, DENY_NONE, A_0},
180 : {1, O_RDONLY, DENY_ALL, O_RDONLY, DENY_NONE, A_0},
181 : {1, O_RDONLY, DENY_ALL, O_WRONLY, DENY_NONE, A_0},
182 : {1, O_RDONLY, DENY_ALL, O_RDWR, DENY_FCB, A_0},
183 : {1, O_RDONLY, DENY_ALL, O_RDONLY, DENY_FCB, A_0},
184 : {1, O_RDONLY, DENY_ALL, O_WRONLY, DENY_FCB, A_0},
185 : {1, O_WRONLY, DENY_ALL, O_RDWR, DENY_DOS, A_0},
186 : {1, O_WRONLY, DENY_ALL, O_RDONLY, DENY_DOS, A_0},
187 : {1, O_WRONLY, DENY_ALL, O_WRONLY, DENY_DOS, A_0},
188 : {1, O_WRONLY, DENY_ALL, O_RDWR, DENY_ALL, A_0},
189 : {1, O_WRONLY, DENY_ALL, O_RDONLY, DENY_ALL, A_0},
190 : {1, O_WRONLY, DENY_ALL, O_WRONLY, DENY_ALL, A_0},
191 : {1, O_WRONLY, DENY_ALL, O_RDWR, DENY_WRITE, A_0},
192 : {1, O_WRONLY, DENY_ALL, O_RDONLY, DENY_WRITE, A_0},
193 : {1, O_WRONLY, DENY_ALL, O_WRONLY, DENY_WRITE, A_0},
194 : {1, O_WRONLY, DENY_ALL, O_RDWR, DENY_READ, A_0},
195 : {1, O_WRONLY, DENY_ALL, O_RDONLY, DENY_READ, A_0},
196 : {1, O_WRONLY, DENY_ALL, O_WRONLY, DENY_READ, A_0},
197 : {1, O_WRONLY, DENY_ALL, O_RDWR, DENY_NONE, A_0},
198 : {1, O_WRONLY, DENY_ALL, O_RDONLY, DENY_NONE, A_0},
199 : {1, O_WRONLY, DENY_ALL, O_WRONLY, DENY_NONE, A_0},
200 : {1, O_WRONLY, DENY_ALL, O_RDWR, DENY_FCB, A_0},
201 : {1, O_WRONLY, DENY_ALL, O_RDONLY, DENY_FCB, A_0},
202 : {1, O_WRONLY, DENY_ALL, O_WRONLY, DENY_FCB, A_0},
203 : {1, O_RDWR, DENY_WRITE, O_RDWR, DENY_DOS, A_0},
204 : {1, O_RDWR, DENY_WRITE, O_RDONLY, DENY_DOS, A_R},
205 : {1, O_RDWR, DENY_WRITE, O_WRONLY, DENY_DOS, A_0},
206 : {1, O_RDWR, DENY_WRITE, O_RDWR, DENY_ALL, A_0},
207 : {1, O_RDWR, DENY_WRITE, O_RDONLY, DENY_ALL, A_0},
208 : {1, O_RDWR, DENY_WRITE, O_WRONLY, DENY_ALL, A_0},
209 : {1, O_RDWR, DENY_WRITE, O_RDWR, DENY_WRITE, A_0},
210 : {1, O_RDWR, DENY_WRITE, O_RDONLY, DENY_WRITE, A_0},
211 : {1, O_RDWR, DENY_WRITE, O_WRONLY, DENY_WRITE, A_0},
212 : {1, O_RDWR, DENY_WRITE, O_RDWR, DENY_READ, A_0},
213 : {1, O_RDWR, DENY_WRITE, O_RDONLY, DENY_READ, A_0},
214 : {1, O_RDWR, DENY_WRITE, O_WRONLY, DENY_READ, A_0},
215 : {1, O_RDWR, DENY_WRITE, O_RDWR, DENY_NONE, A_0},
216 : {1, O_RDWR, DENY_WRITE, O_RDONLY, DENY_NONE, A_R},
217 : {1, O_RDWR, DENY_WRITE, O_WRONLY, DENY_NONE, A_0},
218 : {1, O_RDWR, DENY_WRITE, O_RDWR, DENY_FCB, A_0},
219 : {1, O_RDWR, DENY_WRITE, O_RDONLY, DENY_FCB, A_0},
220 : {1, O_RDWR, DENY_WRITE, O_WRONLY, DENY_FCB, A_0},
221 : {1, O_RDONLY, DENY_WRITE, O_RDWR, DENY_DOS, A_0},
222 : {1, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_DOS, A_R},
223 : {1, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_DOS, A_0},
224 : {1, O_RDONLY, DENY_WRITE, O_RDWR, DENY_ALL, A_0},
225 : {1, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_ALL, A_0},
226 : {1, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_ALL, A_0},
227 : {1, O_RDONLY, DENY_WRITE, O_RDWR, DENY_WRITE, A_0},
228 : {1, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_WRITE, A_R},
229 : {1, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_WRITE, A_0},
230 : {1, O_RDONLY, DENY_WRITE, O_RDWR, DENY_READ, A_0},
231 : {1, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_READ, A_0},
232 : {1, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_READ, A_0},
233 : {1, O_RDONLY, DENY_WRITE, O_RDWR, DENY_NONE, A_0},
234 : {1, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_NONE, A_R},
235 : {1, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_NONE, A_0},
236 : {1, O_RDONLY, DENY_WRITE, O_RDWR, DENY_FCB, A_0},
237 : {1, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_FCB, A_0},
238 : {1, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_FCB, A_0},
239 : {1, O_WRONLY, DENY_WRITE, O_RDWR, DENY_DOS, A_0},
240 : {1, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_DOS, A_R},
241 : {1, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_DOS, A_0},
242 : {1, O_WRONLY, DENY_WRITE, O_RDWR, DENY_ALL, A_0},
243 : {1, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_ALL, A_0},
244 : {1, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_ALL, A_0},
245 : {1, O_WRONLY, DENY_WRITE, O_RDWR, DENY_WRITE, A_0},
246 : {1, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_WRITE, A_0},
247 : {1, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_WRITE, A_0},
248 : {1, O_WRONLY, DENY_WRITE, O_RDWR, DENY_READ, A_0},
249 : {1, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_READ, A_R},
250 : {1, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_READ, A_0},
251 : {1, O_WRONLY, DENY_WRITE, O_RDWR, DENY_NONE, A_0},
252 : {1, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_NONE, A_R},
253 : {1, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_NONE, A_0},
254 : {1, O_WRONLY, DENY_WRITE, O_RDWR, DENY_FCB, A_0},
255 : {1, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_FCB, A_0},
256 : {1, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_FCB, A_0},
257 : {1, O_RDWR, DENY_READ, O_RDWR, DENY_DOS, A_0},
258 : {1, O_RDWR, DENY_READ, O_RDONLY, DENY_DOS, A_0},
259 : {1, O_RDWR, DENY_READ, O_WRONLY, DENY_DOS, A_W},
260 : {1, O_RDWR, DENY_READ, O_RDWR, DENY_ALL, A_0},
261 : {1, O_RDWR, DENY_READ, O_RDONLY, DENY_ALL, A_0},
262 : {1, O_RDWR, DENY_READ, O_WRONLY, DENY_ALL, A_0},
263 : {1, O_RDWR, DENY_READ, O_RDWR, DENY_WRITE, A_0},
264 : {1, O_RDWR, DENY_READ, O_RDONLY, DENY_WRITE, A_0},
265 : {1, O_RDWR, DENY_READ, O_WRONLY, DENY_WRITE, A_0},
266 : {1, O_RDWR, DENY_READ, O_RDWR, DENY_READ, A_0},
267 : {1, O_RDWR, DENY_READ, O_RDONLY, DENY_READ, A_0},
268 : {1, O_RDWR, DENY_READ, O_WRONLY, DENY_READ, A_0},
269 : {1, O_RDWR, DENY_READ, O_RDWR, DENY_NONE, A_0},
270 : {1, O_RDWR, DENY_READ, O_RDONLY, DENY_NONE, A_0},
271 : {1, O_RDWR, DENY_READ, O_WRONLY, DENY_NONE, A_W},
272 : {1, O_RDWR, DENY_READ, O_RDWR, DENY_FCB, A_0},
273 : {1, O_RDWR, DENY_READ, O_RDONLY, DENY_FCB, A_0},
274 : {1, O_RDWR, DENY_READ, O_WRONLY, DENY_FCB, A_0},
275 : {1, O_RDONLY, DENY_READ, O_RDWR, DENY_DOS, A_0},
276 : {1, O_RDONLY, DENY_READ, O_RDONLY, DENY_DOS, A_0},
277 : {1, O_RDONLY, DENY_READ, O_WRONLY, DENY_DOS, A_W},
278 : {1, O_RDONLY, DENY_READ, O_RDWR, DENY_ALL, A_0},
279 : {1, O_RDONLY, DENY_READ, O_RDONLY, DENY_ALL, A_0},
280 : {1, O_RDONLY, DENY_READ, O_WRONLY, DENY_ALL, A_0},
281 : {1, O_RDONLY, DENY_READ, O_RDWR, DENY_WRITE, A_0},
282 : {1, O_RDONLY, DENY_READ, O_RDONLY, DENY_WRITE, A_0},
283 : {1, O_RDONLY, DENY_READ, O_WRONLY, DENY_WRITE, A_W},
284 : {1, O_RDONLY, DENY_READ, O_RDWR, DENY_READ, A_0},
285 : {1, O_RDONLY, DENY_READ, O_RDONLY, DENY_READ, A_0},
286 : {1, O_RDONLY, DENY_READ, O_WRONLY, DENY_READ, A_0},
287 : {1, O_RDONLY, DENY_READ, O_RDWR, DENY_NONE, A_0},
288 : {1, O_RDONLY, DENY_READ, O_RDONLY, DENY_NONE, A_0},
289 : {1, O_RDONLY, DENY_READ, O_WRONLY, DENY_NONE, A_W},
290 : {1, O_RDONLY, DENY_READ, O_RDWR, DENY_FCB, A_0},
291 : {1, O_RDONLY, DENY_READ, O_RDONLY, DENY_FCB, A_0},
292 : {1, O_RDONLY, DENY_READ, O_WRONLY, DENY_FCB, A_0},
293 : {1, O_WRONLY, DENY_READ, O_RDWR, DENY_DOS, A_0},
294 : {1, O_WRONLY, DENY_READ, O_RDONLY, DENY_DOS, A_0},
295 : {1, O_WRONLY, DENY_READ, O_WRONLY, DENY_DOS, A_W},
296 : {1, O_WRONLY, DENY_READ, O_RDWR, DENY_ALL, A_0},
297 : {1, O_WRONLY, DENY_READ, O_RDONLY, DENY_ALL, A_0},
298 : {1, O_WRONLY, DENY_READ, O_WRONLY, DENY_ALL, A_0},
299 : {1, O_WRONLY, DENY_READ, O_RDWR, DENY_WRITE, A_0},
300 : {1, O_WRONLY, DENY_READ, O_RDONLY, DENY_WRITE, A_0},
301 : {1, O_WRONLY, DENY_READ, O_WRONLY, DENY_WRITE, A_0},
302 : {1, O_WRONLY, DENY_READ, O_RDWR, DENY_READ, A_0},
303 : {1, O_WRONLY, DENY_READ, O_RDONLY, DENY_READ, A_0},
304 : {1, O_WRONLY, DENY_READ, O_WRONLY, DENY_READ, A_W},
305 : {1, O_WRONLY, DENY_READ, O_RDWR, DENY_NONE, A_0},
306 : {1, O_WRONLY, DENY_READ, O_RDONLY, DENY_NONE, A_0},
307 : {1, O_WRONLY, DENY_READ, O_WRONLY, DENY_NONE, A_W},
308 : {1, O_WRONLY, DENY_READ, O_RDWR, DENY_FCB, A_0},
309 : {1, O_WRONLY, DENY_READ, O_RDONLY, DENY_FCB, A_0},
310 : {1, O_WRONLY, DENY_READ, O_WRONLY, DENY_FCB, A_0},
311 : {1, O_RDWR, DENY_NONE, O_RDWR, DENY_DOS, A_RW},
312 : {1, O_RDWR, DENY_NONE, O_RDONLY, DENY_DOS, A_R},
313 : {1, O_RDWR, DENY_NONE, O_WRONLY, DENY_DOS, A_W},
314 : {1, O_RDWR, DENY_NONE, O_RDWR, DENY_ALL, A_0},
315 : {1, O_RDWR, DENY_NONE, O_RDONLY, DENY_ALL, A_0},
316 : {1, O_RDWR, DENY_NONE, O_WRONLY, DENY_ALL, A_0},
317 : {1, O_RDWR, DENY_NONE, O_RDWR, DENY_WRITE, A_0},
318 : {1, O_RDWR, DENY_NONE, O_RDONLY, DENY_WRITE, A_0},
319 : {1, O_RDWR, DENY_NONE, O_WRONLY, DENY_WRITE, A_0},
320 : {1, O_RDWR, DENY_NONE, O_RDWR, DENY_READ, A_0},
321 : {1, O_RDWR, DENY_NONE, O_RDONLY, DENY_READ, A_0},
322 : {1, O_RDWR, DENY_NONE, O_WRONLY, DENY_READ, A_0},
323 : {1, O_RDWR, DENY_NONE, O_RDWR, DENY_NONE, A_RW},
324 : {1, O_RDWR, DENY_NONE, O_RDONLY, DENY_NONE, A_R},
325 : {1, O_RDWR, DENY_NONE, O_WRONLY, DENY_NONE, A_W},
326 : {1, O_RDWR, DENY_NONE, O_RDWR, DENY_FCB, A_0},
327 : {1, O_RDWR, DENY_NONE, O_RDONLY, DENY_FCB, A_0},
328 : {1, O_RDWR, DENY_NONE, O_WRONLY, DENY_FCB, A_0},
329 : {1, O_RDONLY, DENY_NONE, O_RDWR, DENY_DOS, A_RW},
330 : {1, O_RDONLY, DENY_NONE, O_RDONLY, DENY_DOS, A_R},
331 : {1, O_RDONLY, DENY_NONE, O_WRONLY, DENY_DOS, A_W},
332 : {1, O_RDONLY, DENY_NONE, O_RDWR, DENY_ALL, A_0},
333 : {1, O_RDONLY, DENY_NONE, O_RDONLY, DENY_ALL, A_0},
334 : {1, O_RDONLY, DENY_NONE, O_WRONLY, DENY_ALL, A_0},
335 : {1, O_RDONLY, DENY_NONE, O_RDWR, DENY_WRITE, A_RW},
336 : {1, O_RDONLY, DENY_NONE, O_RDONLY, DENY_WRITE, A_R},
337 : {1, O_RDONLY, DENY_NONE, O_WRONLY, DENY_WRITE, A_W},
338 : {1, O_RDONLY, DENY_NONE, O_RDWR, DENY_READ, A_0},
339 : {1, O_RDONLY, DENY_NONE, O_RDONLY, DENY_READ, A_0},
340 : {1, O_RDONLY, DENY_NONE, O_WRONLY, DENY_READ, A_0},
341 : {1, O_RDONLY, DENY_NONE, O_RDWR, DENY_NONE, A_RW},
342 : {1, O_RDONLY, DENY_NONE, O_RDONLY, DENY_NONE, A_R},
343 : {1, O_RDONLY, DENY_NONE, O_WRONLY, DENY_NONE, A_W},
344 : {1, O_RDONLY, DENY_NONE, O_RDWR, DENY_FCB, A_0},
345 : {1, O_RDONLY, DENY_NONE, O_RDONLY, DENY_FCB, A_0},
346 : {1, O_RDONLY, DENY_NONE, O_WRONLY, DENY_FCB, A_0},
347 : {1, O_WRONLY, DENY_NONE, O_RDWR, DENY_DOS, A_RW},
348 : {1, O_WRONLY, DENY_NONE, O_RDONLY, DENY_DOS, A_R},
349 : {1, O_WRONLY, DENY_NONE, O_WRONLY, DENY_DOS, A_W},
350 : {1, O_WRONLY, DENY_NONE, O_RDWR, DENY_ALL, A_0},
351 : {1, O_WRONLY, DENY_NONE, O_RDONLY, DENY_ALL, A_0},
352 : {1, O_WRONLY, DENY_NONE, O_WRONLY, DENY_ALL, A_0},
353 : {1, O_WRONLY, DENY_NONE, O_RDWR, DENY_WRITE, A_0},
354 : {1, O_WRONLY, DENY_NONE, O_RDONLY, DENY_WRITE, A_0},
355 : {1, O_WRONLY, DENY_NONE, O_WRONLY, DENY_WRITE, A_0},
356 : {1, O_WRONLY, DENY_NONE, O_RDWR, DENY_READ, A_RW},
357 : {1, O_WRONLY, DENY_NONE, O_RDONLY, DENY_READ, A_R},
358 : {1, O_WRONLY, DENY_NONE, O_WRONLY, DENY_READ, A_W},
359 : {1, O_WRONLY, DENY_NONE, O_RDWR, DENY_NONE, A_RW},
360 : {1, O_WRONLY, DENY_NONE, O_RDONLY, DENY_NONE, A_R},
361 : {1, O_WRONLY, DENY_NONE, O_WRONLY, DENY_NONE, A_W},
362 : {1, O_WRONLY, DENY_NONE, O_RDWR, DENY_FCB, A_0},
363 : {1, O_WRONLY, DENY_NONE, O_RDONLY, DENY_FCB, A_0},
364 : {1, O_WRONLY, DENY_NONE, O_WRONLY, DENY_FCB, A_0},
365 : {1, O_RDWR, DENY_FCB, O_RDWR, DENY_DOS, A_0},
366 : {1, O_RDWR, DENY_FCB, O_RDONLY, DENY_DOS, A_0},
367 : {1, O_RDWR, DENY_FCB, O_WRONLY, DENY_DOS, A_0},
368 : {1, O_RDWR, DENY_FCB, O_RDWR, DENY_ALL, A_0},
369 : {1, O_RDWR, DENY_FCB, O_RDONLY, DENY_ALL, A_0},
370 : {1, O_RDWR, DENY_FCB, O_WRONLY, DENY_ALL, A_0},
371 : {1, O_RDWR, DENY_FCB, O_RDWR, DENY_WRITE, A_0},
372 : {1, O_RDWR, DENY_FCB, O_RDONLY, DENY_WRITE, A_0},
373 : {1, O_RDWR, DENY_FCB, O_WRONLY, DENY_WRITE, A_0},
374 : {1, O_RDWR, DENY_FCB, O_RDWR, DENY_READ, A_0},
375 : {1, O_RDWR, DENY_FCB, O_RDONLY, DENY_READ, A_0},
376 : {1, O_RDWR, DENY_FCB, O_WRONLY, DENY_READ, A_0},
377 : {1, O_RDWR, DENY_FCB, O_RDWR, DENY_NONE, A_0},
378 : {1, O_RDWR, DENY_FCB, O_RDONLY, DENY_NONE, A_0},
379 : {1, O_RDWR, DENY_FCB, O_WRONLY, DENY_NONE, A_0},
380 : {1, O_RDWR, DENY_FCB, O_RDWR, DENY_FCB, A_0},
381 : {1, O_RDWR, DENY_FCB, O_RDONLY, DENY_FCB, A_0},
382 : {1, O_RDWR, DENY_FCB, O_WRONLY, DENY_FCB, A_0},
383 : {1, O_RDONLY, DENY_FCB, O_RDWR, DENY_DOS, A_0},
384 : {1, O_RDONLY, DENY_FCB, O_RDONLY, DENY_DOS, A_0},
385 : {1, O_RDONLY, DENY_FCB, O_WRONLY, DENY_DOS, A_0},
386 : {1, O_RDONLY, DENY_FCB, O_RDWR, DENY_ALL, A_0},
387 : {1, O_RDONLY, DENY_FCB, O_RDONLY, DENY_ALL, A_0},
388 : {1, O_RDONLY, DENY_FCB, O_WRONLY, DENY_ALL, A_0},
389 : {1, O_RDONLY, DENY_FCB, O_RDWR, DENY_WRITE, A_0},
390 : {1, O_RDONLY, DENY_FCB, O_RDONLY, DENY_WRITE, A_0},
391 : {1, O_RDONLY, DENY_FCB, O_WRONLY, DENY_WRITE, A_0},
392 : {1, O_RDONLY, DENY_FCB, O_RDWR, DENY_READ, A_0},
393 : {1, O_RDONLY, DENY_FCB, O_RDONLY, DENY_READ, A_0},
394 : {1, O_RDONLY, DENY_FCB, O_WRONLY, DENY_READ, A_0},
395 : {1, O_RDONLY, DENY_FCB, O_RDWR, DENY_NONE, A_0},
396 : {1, O_RDONLY, DENY_FCB, O_RDONLY, DENY_NONE, A_0},
397 : {1, O_RDONLY, DENY_FCB, O_WRONLY, DENY_NONE, A_0},
398 : {1, O_RDONLY, DENY_FCB, O_RDWR, DENY_FCB, A_0},
399 : {1, O_RDONLY, DENY_FCB, O_RDONLY, DENY_FCB, A_0},
400 : {1, O_RDONLY, DENY_FCB, O_WRONLY, DENY_FCB, A_0},
401 : {1, O_WRONLY, DENY_FCB, O_RDWR, DENY_DOS, A_0},
402 : {1, O_WRONLY, DENY_FCB, O_RDONLY, DENY_DOS, A_0},
403 : {1, O_WRONLY, DENY_FCB, O_WRONLY, DENY_DOS, A_0},
404 : {1, O_WRONLY, DENY_FCB, O_RDWR, DENY_ALL, A_0},
405 : {1, O_WRONLY, DENY_FCB, O_RDONLY, DENY_ALL, A_0},
406 : {1, O_WRONLY, DENY_FCB, O_WRONLY, DENY_ALL, A_0},
407 : {1, O_WRONLY, DENY_FCB, O_RDWR, DENY_WRITE, A_0},
408 : {1, O_WRONLY, DENY_FCB, O_RDONLY, DENY_WRITE, A_0},
409 : {1, O_WRONLY, DENY_FCB, O_WRONLY, DENY_WRITE, A_0},
410 : {1, O_WRONLY, DENY_FCB, O_RDWR, DENY_READ, A_0},
411 : {1, O_WRONLY, DENY_FCB, O_RDONLY, DENY_READ, A_0},
412 : {1, O_WRONLY, DENY_FCB, O_WRONLY, DENY_READ, A_0},
413 : {1, O_WRONLY, DENY_FCB, O_RDWR, DENY_NONE, A_0},
414 : {1, O_WRONLY, DENY_FCB, O_RDONLY, DENY_NONE, A_0},
415 : {1, O_WRONLY, DENY_FCB, O_WRONLY, DENY_NONE, A_0},
416 : {1, O_WRONLY, DENY_FCB, O_RDWR, DENY_FCB, A_0},
417 : {1, O_WRONLY, DENY_FCB, O_RDONLY, DENY_FCB, A_0},
418 : {1, O_WRONLY, DENY_FCB, O_WRONLY, DENY_FCB, A_0},
419 : {0, O_RDWR, DENY_DOS, O_RDWR, DENY_DOS, A_0},
420 : {0, O_RDWR, DENY_DOS, O_RDONLY, DENY_DOS, A_0},
421 : {0, O_RDWR, DENY_DOS, O_WRONLY, DENY_DOS, A_0},
422 : {0, O_RDWR, DENY_DOS, O_RDWR, DENY_ALL, A_0},
423 : {0, O_RDWR, DENY_DOS, O_RDONLY, DENY_ALL, A_0},
424 : {0, O_RDWR, DENY_DOS, O_WRONLY, DENY_ALL, A_0},
425 : {0, O_RDWR, DENY_DOS, O_RDWR, DENY_WRITE, A_0},
426 : {0, O_RDWR, DENY_DOS, O_RDONLY, DENY_WRITE, A_0},
427 : {0, O_RDWR, DENY_DOS, O_WRONLY, DENY_WRITE, A_0},
428 : {0, O_RDWR, DENY_DOS, O_RDWR, DENY_READ, A_0},
429 : {0, O_RDWR, DENY_DOS, O_RDONLY, DENY_READ, A_0},
430 : {0, O_RDWR, DENY_DOS, O_WRONLY, DENY_READ, A_0},
431 : {0, O_RDWR, DENY_DOS, O_RDWR, DENY_NONE, A_0},
432 : {0, O_RDWR, DENY_DOS, O_RDONLY, DENY_NONE, A_0},
433 : {0, O_RDWR, DENY_DOS, O_WRONLY, DENY_NONE, A_0},
434 : {0, O_RDWR, DENY_DOS, O_RDWR, DENY_FCB, A_0},
435 : {0, O_RDWR, DENY_DOS, O_RDONLY, DENY_FCB, A_0},
436 : {0, O_RDWR, DENY_DOS, O_WRONLY, DENY_FCB, A_0},
437 : {0, O_RDONLY, DENY_DOS, O_RDWR, DENY_DOS, A_0},
438 : {0, O_RDONLY, DENY_DOS, O_RDONLY, DENY_DOS, A_R},
439 : {0, O_RDONLY, DENY_DOS, O_WRONLY, DENY_DOS, A_0},
440 : {0, O_RDONLY, DENY_DOS, O_RDWR, DENY_ALL, A_0},
441 : {0, O_RDONLY, DENY_DOS, O_RDONLY, DENY_ALL, A_0},
442 : {0, O_RDONLY, DENY_DOS, O_WRONLY, DENY_ALL, A_0},
443 : {0, O_RDONLY, DENY_DOS, O_RDWR, DENY_WRITE, A_0},
444 : {0, O_RDONLY, DENY_DOS, O_RDONLY, DENY_WRITE, A_R},
445 : {0, O_RDONLY, DENY_DOS, O_WRONLY, DENY_WRITE, A_0},
446 : {0, O_RDONLY, DENY_DOS, O_RDWR, DENY_READ, A_0},
447 : {0, O_RDONLY, DENY_DOS, O_RDONLY, DENY_READ, A_0},
448 : {0, O_RDONLY, DENY_DOS, O_WRONLY, DENY_READ, A_0},
449 : {0, O_RDONLY, DENY_DOS, O_RDWR, DENY_NONE, A_0},
450 : {0, O_RDONLY, DENY_DOS, O_RDONLY, DENY_NONE, A_R},
451 : {0, O_RDONLY, DENY_DOS, O_WRONLY, DENY_NONE, A_0},
452 : {0, O_RDONLY, DENY_DOS, O_RDWR, DENY_FCB, A_0},
453 : {0, O_RDONLY, DENY_DOS, O_RDONLY, DENY_FCB, A_0},
454 : {0, O_RDONLY, DENY_DOS, O_WRONLY, DENY_FCB, A_0},
455 : {0, O_WRONLY, DENY_DOS, O_RDWR, DENY_DOS, A_0},
456 : {0, O_WRONLY, DENY_DOS, O_RDONLY, DENY_DOS, A_0},
457 : {0, O_WRONLY, DENY_DOS, O_WRONLY, DENY_DOS, A_0},
458 : {0, O_WRONLY, DENY_DOS, O_RDWR, DENY_ALL, A_0},
459 : {0, O_WRONLY, DENY_DOS, O_RDONLY, DENY_ALL, A_0},
460 : {0, O_WRONLY, DENY_DOS, O_WRONLY, DENY_ALL, A_0},
461 : {0, O_WRONLY, DENY_DOS, O_RDWR, DENY_WRITE, A_0},
462 : {0, O_WRONLY, DENY_DOS, O_RDONLY, DENY_WRITE, A_0},
463 : {0, O_WRONLY, DENY_DOS, O_WRONLY, DENY_WRITE, A_0},
464 : {0, O_WRONLY, DENY_DOS, O_RDWR, DENY_READ, A_0},
465 : {0, O_WRONLY, DENY_DOS, O_RDONLY, DENY_READ, A_0},
466 : {0, O_WRONLY, DENY_DOS, O_WRONLY, DENY_READ, A_0},
467 : {0, O_WRONLY, DENY_DOS, O_RDWR, DENY_NONE, A_0},
468 : {0, O_WRONLY, DENY_DOS, O_RDONLY, DENY_NONE, A_0},
469 : {0, O_WRONLY, DENY_DOS, O_WRONLY, DENY_NONE, A_0},
470 : {0, O_WRONLY, DENY_DOS, O_RDWR, DENY_FCB, A_0},
471 : {0, O_WRONLY, DENY_DOS, O_RDONLY, DENY_FCB, A_0},
472 : {0, O_WRONLY, DENY_DOS, O_WRONLY, DENY_FCB, A_0},
473 : {0, O_RDWR, DENY_ALL, O_RDWR, DENY_DOS, A_0},
474 : {0, O_RDWR, DENY_ALL, O_RDONLY, DENY_DOS, A_0},
475 : {0, O_RDWR, DENY_ALL, O_WRONLY, DENY_DOS, A_0},
476 : {0, O_RDWR, DENY_ALL, O_RDWR, DENY_ALL, A_0},
477 : {0, O_RDWR, DENY_ALL, O_RDONLY, DENY_ALL, A_0},
478 : {0, O_RDWR, DENY_ALL, O_WRONLY, DENY_ALL, A_0},
479 : {0, O_RDWR, DENY_ALL, O_RDWR, DENY_WRITE, A_0},
480 : {0, O_RDWR, DENY_ALL, O_RDONLY, DENY_WRITE, A_0},
481 : {0, O_RDWR, DENY_ALL, O_WRONLY, DENY_WRITE, A_0},
482 : {0, O_RDWR, DENY_ALL, O_RDWR, DENY_READ, A_0},
483 : {0, O_RDWR, DENY_ALL, O_RDONLY, DENY_READ, A_0},
484 : {0, O_RDWR, DENY_ALL, O_WRONLY, DENY_READ, A_0},
485 : {0, O_RDWR, DENY_ALL, O_RDWR, DENY_NONE, A_0},
486 : {0, O_RDWR, DENY_ALL, O_RDONLY, DENY_NONE, A_0},
487 : {0, O_RDWR, DENY_ALL, O_WRONLY, DENY_NONE, A_0},
488 : {0, O_RDWR, DENY_ALL, O_RDWR, DENY_FCB, A_0},
489 : {0, O_RDWR, DENY_ALL, O_RDONLY, DENY_FCB, A_0},
490 : {0, O_RDWR, DENY_ALL, O_WRONLY, DENY_FCB, A_0},
491 : {0, O_RDONLY, DENY_ALL, O_RDWR, DENY_DOS, A_0},
492 : {0, O_RDONLY, DENY_ALL, O_RDONLY, DENY_DOS, A_0},
493 : {0, O_RDONLY, DENY_ALL, O_WRONLY, DENY_DOS, A_0},
494 : {0, O_RDONLY, DENY_ALL, O_RDWR, DENY_ALL, A_0},
495 : {0, O_RDONLY, DENY_ALL, O_RDONLY, DENY_ALL, A_0},
496 : {0, O_RDONLY, DENY_ALL, O_WRONLY, DENY_ALL, A_0},
497 : {0, O_RDONLY, DENY_ALL, O_RDWR, DENY_WRITE, A_0},
498 : {0, O_RDONLY, DENY_ALL, O_RDONLY, DENY_WRITE, A_0},
499 : {0, O_RDONLY, DENY_ALL, O_WRONLY, DENY_WRITE, A_0},
500 : {0, O_RDONLY, DENY_ALL, O_RDWR, DENY_READ, A_0},
501 : {0, O_RDONLY, DENY_ALL, O_RDONLY, DENY_READ, A_0},
502 : {0, O_RDONLY, DENY_ALL, O_WRONLY, DENY_READ, A_0},
503 : {0, O_RDONLY, DENY_ALL, O_RDWR, DENY_NONE, A_0},
504 : {0, O_RDONLY, DENY_ALL, O_RDONLY, DENY_NONE, A_0},
505 : {0, O_RDONLY, DENY_ALL, O_WRONLY, DENY_NONE, A_0},
506 : {0, O_RDONLY, DENY_ALL, O_RDWR, DENY_FCB, A_0},
507 : {0, O_RDONLY, DENY_ALL, O_RDONLY, DENY_FCB, A_0},
508 : {0, O_RDONLY, DENY_ALL, O_WRONLY, DENY_FCB, A_0},
509 : {0, O_WRONLY, DENY_ALL, O_RDWR, DENY_DOS, A_0},
510 : {0, O_WRONLY, DENY_ALL, O_RDONLY, DENY_DOS, A_0},
511 : {0, O_WRONLY, DENY_ALL, O_WRONLY, DENY_DOS, A_0},
512 : {0, O_WRONLY, DENY_ALL, O_RDWR, DENY_ALL, A_0},
513 : {0, O_WRONLY, DENY_ALL, O_RDONLY, DENY_ALL, A_0},
514 : {0, O_WRONLY, DENY_ALL, O_WRONLY, DENY_ALL, A_0},
515 : {0, O_WRONLY, DENY_ALL, O_RDWR, DENY_WRITE, A_0},
516 : {0, O_WRONLY, DENY_ALL, O_RDONLY, DENY_WRITE, A_0},
517 : {0, O_WRONLY, DENY_ALL, O_WRONLY, DENY_WRITE, A_0},
518 : {0, O_WRONLY, DENY_ALL, O_RDWR, DENY_READ, A_0},
519 : {0, O_WRONLY, DENY_ALL, O_RDONLY, DENY_READ, A_0},
520 : {0, O_WRONLY, DENY_ALL, O_WRONLY, DENY_READ, A_0},
521 : {0, O_WRONLY, DENY_ALL, O_RDWR, DENY_NONE, A_0},
522 : {0, O_WRONLY, DENY_ALL, O_RDONLY, DENY_NONE, A_0},
523 : {0, O_WRONLY, DENY_ALL, O_WRONLY, DENY_NONE, A_0},
524 : {0, O_WRONLY, DENY_ALL, O_RDWR, DENY_FCB, A_0},
525 : {0, O_WRONLY, DENY_ALL, O_RDONLY, DENY_FCB, A_0},
526 : {0, O_WRONLY, DENY_ALL, O_WRONLY, DENY_FCB, A_0},
527 : {0, O_RDWR, DENY_WRITE, O_RDWR, DENY_DOS, A_0},
528 : {0, O_RDWR, DENY_WRITE, O_RDONLY, DENY_DOS, A_0},
529 : {0, O_RDWR, DENY_WRITE, O_WRONLY, DENY_DOS, A_0},
530 : {0, O_RDWR, DENY_WRITE, O_RDWR, DENY_ALL, A_0},
531 : {0, O_RDWR, DENY_WRITE, O_RDONLY, DENY_ALL, A_0},
532 : {0, O_RDWR, DENY_WRITE, O_WRONLY, DENY_ALL, A_0},
533 : {0, O_RDWR, DENY_WRITE, O_RDWR, DENY_WRITE, A_0},
534 : {0, O_RDWR, DENY_WRITE, O_RDONLY, DENY_WRITE, A_0},
535 : {0, O_RDWR, DENY_WRITE, O_WRONLY, DENY_WRITE, A_0},
536 : {0, O_RDWR, DENY_WRITE, O_RDWR, DENY_READ, A_0},
537 : {0, O_RDWR, DENY_WRITE, O_RDONLY, DENY_READ, A_0},
538 : {0, O_RDWR, DENY_WRITE, O_WRONLY, DENY_READ, A_0},
539 : {0, O_RDWR, DENY_WRITE, O_RDWR, DENY_NONE, A_0},
540 : {0, O_RDWR, DENY_WRITE, O_RDONLY, DENY_NONE, A_R},
541 : {0, O_RDWR, DENY_WRITE, O_WRONLY, DENY_NONE, A_0},
542 : {0, O_RDWR, DENY_WRITE, O_RDWR, DENY_FCB, A_0},
543 : {0, O_RDWR, DENY_WRITE, O_RDONLY, DENY_FCB, A_0},
544 : {0, O_RDWR, DENY_WRITE, O_WRONLY, DENY_FCB, A_0},
545 : {0, O_RDONLY, DENY_WRITE, O_RDWR, DENY_DOS, A_0},
546 : {0, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_DOS, A_R},
547 : {0, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_DOS, A_0},
548 : {0, O_RDONLY, DENY_WRITE, O_RDWR, DENY_ALL, A_0},
549 : {0, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_ALL, A_0},
550 : {0, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_ALL, A_0},
551 : {0, O_RDONLY, DENY_WRITE, O_RDWR, DENY_WRITE, A_0},
552 : {0, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_WRITE, A_R},
553 : {0, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_WRITE, A_0},
554 : {0, O_RDONLY, DENY_WRITE, O_RDWR, DENY_READ, A_0},
555 : {0, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_READ, A_0},
556 : {0, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_READ, A_0},
557 : {0, O_RDONLY, DENY_WRITE, O_RDWR, DENY_NONE, A_0},
558 : {0, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_NONE, A_R},
559 : {0, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_NONE, A_0},
560 : {0, O_RDONLY, DENY_WRITE, O_RDWR, DENY_FCB, A_0},
561 : {0, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_FCB, A_0},
562 : {0, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_FCB, A_0},
563 : {0, O_WRONLY, DENY_WRITE, O_RDWR, DENY_DOS, A_0},
564 : {0, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_DOS, A_0},
565 : {0, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_DOS, A_0},
566 : {0, O_WRONLY, DENY_WRITE, O_RDWR, DENY_ALL, A_0},
567 : {0, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_ALL, A_0},
568 : {0, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_ALL, A_0},
569 : {0, O_WRONLY, DENY_WRITE, O_RDWR, DENY_WRITE, A_0},
570 : {0, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_WRITE, A_0},
571 : {0, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_WRITE, A_0},
572 : {0, O_WRONLY, DENY_WRITE, O_RDWR, DENY_READ, A_0},
573 : {0, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_READ, A_R},
574 : {0, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_READ, A_0},
575 : {0, O_WRONLY, DENY_WRITE, O_RDWR, DENY_NONE, A_0},
576 : {0, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_NONE, A_R},
577 : {0, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_NONE, A_0},
578 : {0, O_WRONLY, DENY_WRITE, O_RDWR, DENY_FCB, A_0},
579 : {0, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_FCB, A_0},
580 : {0, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_FCB, A_0},
581 : {0, O_RDWR, DENY_READ, O_RDWR, DENY_DOS, A_0},
582 : {0, O_RDWR, DENY_READ, O_RDONLY, DENY_DOS, A_0},
583 : {0, O_RDWR, DENY_READ, O_WRONLY, DENY_DOS, A_0},
584 : {0, O_RDWR, DENY_READ, O_RDWR, DENY_ALL, A_0},
585 : {0, O_RDWR, DENY_READ, O_RDONLY, DENY_ALL, A_0},
586 : {0, O_RDWR, DENY_READ, O_WRONLY, DENY_ALL, A_0},
587 : {0, O_RDWR, DENY_READ, O_RDWR, DENY_WRITE, A_0},
588 : {0, O_RDWR, DENY_READ, O_RDONLY, DENY_WRITE, A_0},
589 : {0, O_RDWR, DENY_READ, O_WRONLY, DENY_WRITE, A_0},
590 : {0, O_RDWR, DENY_READ, O_RDWR, DENY_READ, A_0},
591 : {0, O_RDWR, DENY_READ, O_RDONLY, DENY_READ, A_0},
592 : {0, O_RDWR, DENY_READ, O_WRONLY, DENY_READ, A_0},
593 : {0, O_RDWR, DENY_READ, O_RDWR, DENY_NONE, A_0},
594 : {0, O_RDWR, DENY_READ, O_RDONLY, DENY_NONE, A_0},
595 : {0, O_RDWR, DENY_READ, O_WRONLY, DENY_NONE, A_W},
596 : {0, O_RDWR, DENY_READ, O_RDWR, DENY_FCB, A_0},
597 : {0, O_RDWR, DENY_READ, O_RDONLY, DENY_FCB, A_0},
598 : {0, O_RDWR, DENY_READ, O_WRONLY, DENY_FCB, A_0},
599 : {0, O_RDONLY, DENY_READ, O_RDWR, DENY_DOS, A_0},
600 : {0, O_RDONLY, DENY_READ, O_RDONLY, DENY_DOS, A_0},
601 : {0, O_RDONLY, DENY_READ, O_WRONLY, DENY_DOS, A_0},
602 : {0, O_RDONLY, DENY_READ, O_RDWR, DENY_ALL, A_0},
603 : {0, O_RDONLY, DENY_READ, O_RDONLY, DENY_ALL, A_0},
604 : {0, O_RDONLY, DENY_READ, O_WRONLY, DENY_ALL, A_0},
605 : {0, O_RDONLY, DENY_READ, O_RDWR, DENY_WRITE, A_0},
606 : {0, O_RDONLY, DENY_READ, O_RDONLY, DENY_WRITE, A_0},
607 : {0, O_RDONLY, DENY_READ, O_WRONLY, DENY_WRITE, A_W},
608 : {0, O_RDONLY, DENY_READ, O_RDWR, DENY_READ, A_0},
609 : {0, O_RDONLY, DENY_READ, O_RDONLY, DENY_READ, A_0},
610 : {0, O_RDONLY, DENY_READ, O_WRONLY, DENY_READ, A_0},
611 : {0, O_RDONLY, DENY_READ, O_RDWR, DENY_NONE, A_0},
612 : {0, O_RDONLY, DENY_READ, O_RDONLY, DENY_NONE, A_0},
613 : {0, O_RDONLY, DENY_READ, O_WRONLY, DENY_NONE, A_W},
614 : {0, O_RDONLY, DENY_READ, O_RDWR, DENY_FCB, A_0},
615 : {0, O_RDONLY, DENY_READ, O_RDONLY, DENY_FCB, A_0},
616 : {0, O_RDONLY, DENY_READ, O_WRONLY, DENY_FCB, A_0},
617 : {0, O_WRONLY, DENY_READ, O_RDWR, DENY_DOS, A_0},
618 : {0, O_WRONLY, DENY_READ, O_RDONLY, DENY_DOS, A_0},
619 : {0, O_WRONLY, DENY_READ, O_WRONLY, DENY_DOS, A_0},
620 : {0, O_WRONLY, DENY_READ, O_RDWR, DENY_ALL, A_0},
621 : {0, O_WRONLY, DENY_READ, O_RDONLY, DENY_ALL, A_0},
622 : {0, O_WRONLY, DENY_READ, O_WRONLY, DENY_ALL, A_0},
623 : {0, O_WRONLY, DENY_READ, O_RDWR, DENY_WRITE, A_0},
624 : {0, O_WRONLY, DENY_READ, O_RDONLY, DENY_WRITE, A_0},
625 : {0, O_WRONLY, DENY_READ, O_WRONLY, DENY_WRITE, A_0},
626 : {0, O_WRONLY, DENY_READ, O_RDWR, DENY_READ, A_0},
627 : {0, O_WRONLY, DENY_READ, O_RDONLY, DENY_READ, A_0},
628 : {0, O_WRONLY, DENY_READ, O_WRONLY, DENY_READ, A_W},
629 : {0, O_WRONLY, DENY_READ, O_RDWR, DENY_NONE, A_0},
630 : {0, O_WRONLY, DENY_READ, O_RDONLY, DENY_NONE, A_0},
631 : {0, O_WRONLY, DENY_READ, O_WRONLY, DENY_NONE, A_W},
632 : {0, O_WRONLY, DENY_READ, O_RDWR, DENY_FCB, A_0},
633 : {0, O_WRONLY, DENY_READ, O_RDONLY, DENY_FCB, A_0},
634 : {0, O_WRONLY, DENY_READ, O_WRONLY, DENY_FCB, A_0},
635 : {0, O_RDWR, DENY_NONE, O_RDWR, DENY_DOS, A_0},
636 : {0, O_RDWR, DENY_NONE, O_RDONLY, DENY_DOS, A_0},
637 : {0, O_RDWR, DENY_NONE, O_WRONLY, DENY_DOS, A_0},
638 : {0, O_RDWR, DENY_NONE, O_RDWR, DENY_ALL, A_0},
639 : {0, O_RDWR, DENY_NONE, O_RDONLY, DENY_ALL, A_0},
640 : {0, O_RDWR, DENY_NONE, O_WRONLY, DENY_ALL, A_0},
641 : {0, O_RDWR, DENY_NONE, O_RDWR, DENY_WRITE, A_0},
642 : {0, O_RDWR, DENY_NONE, O_RDONLY, DENY_WRITE, A_0},
643 : {0, O_RDWR, DENY_NONE, O_WRONLY, DENY_WRITE, A_0},
644 : {0, O_RDWR, DENY_NONE, O_RDWR, DENY_READ, A_0},
645 : {0, O_RDWR, DENY_NONE, O_RDONLY, DENY_READ, A_0},
646 : {0, O_RDWR, DENY_NONE, O_WRONLY, DENY_READ, A_0},
647 : {0, O_RDWR, DENY_NONE, O_RDWR, DENY_NONE, A_RW},
648 : {0, O_RDWR, DENY_NONE, O_RDONLY, DENY_NONE, A_R},
649 : {0, O_RDWR, DENY_NONE, O_WRONLY, DENY_NONE, A_W},
650 : {0, O_RDWR, DENY_NONE, O_RDWR, DENY_FCB, A_0},
651 : {0, O_RDWR, DENY_NONE, O_RDONLY, DENY_FCB, A_0},
652 : {0, O_RDWR, DENY_NONE, O_WRONLY, DENY_FCB, A_0},
653 : {0, O_RDONLY, DENY_NONE, O_RDWR, DENY_DOS, A_0},
654 : {0, O_RDONLY, DENY_NONE, O_RDONLY, DENY_DOS, A_R},
655 : {0, O_RDONLY, DENY_NONE, O_WRONLY, DENY_DOS, A_0},
656 : {0, O_RDONLY, DENY_NONE, O_RDWR, DENY_ALL, A_0},
657 : {0, O_RDONLY, DENY_NONE, O_RDONLY, DENY_ALL, A_0},
658 : {0, O_RDONLY, DENY_NONE, O_WRONLY, DENY_ALL, A_0},
659 : {0, O_RDONLY, DENY_NONE, O_RDWR, DENY_WRITE, A_RW},
660 : {0, O_RDONLY, DENY_NONE, O_RDONLY, DENY_WRITE, A_R},
661 : {0, O_RDONLY, DENY_NONE, O_WRONLY, DENY_WRITE, A_W},
662 : {0, O_RDONLY, DENY_NONE, O_RDWR, DENY_READ, A_0},
663 : {0, O_RDONLY, DENY_NONE, O_RDONLY, DENY_READ, A_0},
664 : {0, O_RDONLY, DENY_NONE, O_WRONLY, DENY_READ, A_0},
665 : {0, O_RDONLY, DENY_NONE, O_RDWR, DENY_NONE, A_RW},
666 : {0, O_RDONLY, DENY_NONE, O_RDONLY, DENY_NONE, A_R},
667 : {0, O_RDONLY, DENY_NONE, O_WRONLY, DENY_NONE, A_W},
668 : {0, O_RDONLY, DENY_NONE, O_RDWR, DENY_FCB, A_0},
669 : {0, O_RDONLY, DENY_NONE, O_RDONLY, DENY_FCB, A_0},
670 : {0, O_RDONLY, DENY_NONE, O_WRONLY, DENY_FCB, A_0},
671 : {0, O_WRONLY, DENY_NONE, O_RDWR, DENY_DOS, A_0},
672 : {0, O_WRONLY, DENY_NONE, O_RDONLY, DENY_DOS, A_0},
673 : {0, O_WRONLY, DENY_NONE, O_WRONLY, DENY_DOS, A_0},
674 : {0, O_WRONLY, DENY_NONE, O_RDWR, DENY_ALL, A_0},
675 : {0, O_WRONLY, DENY_NONE, O_RDONLY, DENY_ALL, A_0},
676 : {0, O_WRONLY, DENY_NONE, O_WRONLY, DENY_ALL, A_0},
677 : {0, O_WRONLY, DENY_NONE, O_RDWR, DENY_WRITE, A_0},
678 : {0, O_WRONLY, DENY_NONE, O_RDONLY, DENY_WRITE, A_0},
679 : {0, O_WRONLY, DENY_NONE, O_WRONLY, DENY_WRITE, A_0},
680 : {0, O_WRONLY, DENY_NONE, O_RDWR, DENY_READ, A_RW},
681 : {0, O_WRONLY, DENY_NONE, O_RDONLY, DENY_READ, A_R},
682 : {0, O_WRONLY, DENY_NONE, O_WRONLY, DENY_READ, A_W},
683 : {0, O_WRONLY, DENY_NONE, O_RDWR, DENY_NONE, A_RW},
684 : {0, O_WRONLY, DENY_NONE, O_RDONLY, DENY_NONE, A_R},
685 : {0, O_WRONLY, DENY_NONE, O_WRONLY, DENY_NONE, A_W},
686 : {0, O_WRONLY, DENY_NONE, O_RDWR, DENY_FCB, A_0},
687 : {0, O_WRONLY, DENY_NONE, O_RDONLY, DENY_FCB, A_0},
688 : {0, O_WRONLY, DENY_NONE, O_WRONLY, DENY_FCB, A_0},
689 : {0, O_RDWR, DENY_FCB, O_RDWR, DENY_DOS, A_0},
690 : {0, O_RDWR, DENY_FCB, O_RDONLY, DENY_DOS, A_0},
691 : {0, O_RDWR, DENY_FCB, O_WRONLY, DENY_DOS, A_0},
692 : {0, O_RDWR, DENY_FCB, O_RDWR, DENY_ALL, A_0},
693 : {0, O_RDWR, DENY_FCB, O_RDONLY, DENY_ALL, A_0},
694 : {0, O_RDWR, DENY_FCB, O_WRONLY, DENY_ALL, A_0},
695 : {0, O_RDWR, DENY_FCB, O_RDWR, DENY_WRITE, A_0},
696 : {0, O_RDWR, DENY_FCB, O_RDONLY, DENY_WRITE, A_0},
697 : {0, O_RDWR, DENY_FCB, O_WRONLY, DENY_WRITE, A_0},
698 : {0, O_RDWR, DENY_FCB, O_RDWR, DENY_READ, A_0},
699 : {0, O_RDWR, DENY_FCB, O_RDONLY, DENY_READ, A_0},
700 : {0, O_RDWR, DENY_FCB, O_WRONLY, DENY_READ, A_0},
701 : {0, O_RDWR, DENY_FCB, O_RDWR, DENY_NONE, A_0},
702 : {0, O_RDWR, DENY_FCB, O_RDONLY, DENY_NONE, A_0},
703 : {0, O_RDWR, DENY_FCB, O_WRONLY, DENY_NONE, A_0},
704 : {0, O_RDWR, DENY_FCB, O_RDWR, DENY_FCB, A_0},
705 : {0, O_RDWR, DENY_FCB, O_RDONLY, DENY_FCB, A_0},
706 : {0, O_RDWR, DENY_FCB, O_WRONLY, DENY_FCB, A_0},
707 : {0, O_RDONLY, DENY_FCB, O_RDWR, DENY_DOS, A_0},
708 : {0, O_RDONLY, DENY_FCB, O_RDONLY, DENY_DOS, A_0},
709 : {0, O_RDONLY, DENY_FCB, O_WRONLY, DENY_DOS, A_0},
710 : {0, O_RDONLY, DENY_FCB, O_RDWR, DENY_ALL, A_0},
711 : {0, O_RDONLY, DENY_FCB, O_RDONLY, DENY_ALL, A_0},
712 : {0, O_RDONLY, DENY_FCB, O_WRONLY, DENY_ALL, A_0},
713 : {0, O_RDONLY, DENY_FCB, O_RDWR, DENY_WRITE, A_0},
714 : {0, O_RDONLY, DENY_FCB, O_RDONLY, DENY_WRITE, A_0},
715 : {0, O_RDONLY, DENY_FCB, O_WRONLY, DENY_WRITE, A_0},
716 : {0, O_RDONLY, DENY_FCB, O_RDWR, DENY_READ, A_0},
717 : {0, O_RDONLY, DENY_FCB, O_RDONLY, DENY_READ, A_0},
718 : {0, O_RDONLY, DENY_FCB, O_WRONLY, DENY_READ, A_0},
719 : {0, O_RDONLY, DENY_FCB, O_RDWR, DENY_NONE, A_0},
720 : {0, O_RDONLY, DENY_FCB, O_RDONLY, DENY_NONE, A_0},
721 : {0, O_RDONLY, DENY_FCB, O_WRONLY, DENY_NONE, A_0},
722 : {0, O_RDONLY, DENY_FCB, O_RDWR, DENY_FCB, A_0},
723 : {0, O_RDONLY, DENY_FCB, O_RDONLY, DENY_FCB, A_0},
724 : {0, O_RDONLY, DENY_FCB, O_WRONLY, DENY_FCB, A_0},
725 : {0, O_WRONLY, DENY_FCB, O_RDWR, DENY_DOS, A_0},
726 : {0, O_WRONLY, DENY_FCB, O_RDONLY, DENY_DOS, A_0},
727 : {0, O_WRONLY, DENY_FCB, O_WRONLY, DENY_DOS, A_0},
728 : {0, O_WRONLY, DENY_FCB, O_RDWR, DENY_ALL, A_0},
729 : {0, O_WRONLY, DENY_FCB, O_RDONLY, DENY_ALL, A_0},
730 : {0, O_WRONLY, DENY_FCB, O_WRONLY, DENY_ALL, A_0},
731 : {0, O_WRONLY, DENY_FCB, O_RDWR, DENY_WRITE, A_0},
732 : {0, O_WRONLY, DENY_FCB, O_RDONLY, DENY_WRITE, A_0},
733 : {0, O_WRONLY, DENY_FCB, O_WRONLY, DENY_WRITE, A_0},
734 : {0, O_WRONLY, DENY_FCB, O_RDWR, DENY_READ, A_0},
735 : {0, O_WRONLY, DENY_FCB, O_RDONLY, DENY_READ, A_0},
736 : {0, O_WRONLY, DENY_FCB, O_WRONLY, DENY_READ, A_0},
737 : {0, O_WRONLY, DENY_FCB, O_RDWR, DENY_NONE, A_0},
738 : {0, O_WRONLY, DENY_FCB, O_RDONLY, DENY_NONE, A_0},
739 : {0, O_WRONLY, DENY_FCB, O_WRONLY, DENY_NONE, A_0},
740 : {0, O_WRONLY, DENY_FCB, O_RDWR, DENY_FCB, A_0},
741 : {0, O_WRONLY, DENY_FCB, O_RDONLY, DENY_FCB, A_0},
742 : {0, O_WRONLY, DENY_FCB, O_WRONLY, DENY_FCB, A_0}
743 : };
744 :
745 :
746 : static const struct {
747 : int isexe;
748 : int mode1, deny1;
749 : int mode2, deny2;
750 : enum deny_result result;
751 : } denytable1[] = {
752 : {1, O_RDWR, DENY_DOS, O_RDWR, DENY_DOS, A_RW},
753 : {1, O_RDWR, DENY_DOS, O_RDONLY, DENY_DOS, A_R},
754 : {1, O_RDWR, DENY_DOS, O_WRONLY, DENY_DOS, A_W},
755 : {1, O_RDWR, DENY_DOS, O_RDWR, DENY_ALL, A_0},
756 : {1, O_RDWR, DENY_DOS, O_RDONLY, DENY_ALL, A_0},
757 : {1, O_RDWR, DENY_DOS, O_WRONLY, DENY_ALL, A_0},
758 : {1, O_RDWR, DENY_DOS, O_RDWR, DENY_WRITE, A_0},
759 : {1, O_RDWR, DENY_DOS, O_RDONLY, DENY_WRITE, A_0},
760 : {1, O_RDWR, DENY_DOS, O_WRONLY, DENY_WRITE, A_0},
761 : {1, O_RDWR, DENY_DOS, O_RDWR, DENY_READ, A_0},
762 : {1, O_RDWR, DENY_DOS, O_RDONLY, DENY_READ, A_0},
763 : {1, O_RDWR, DENY_DOS, O_WRONLY, DENY_READ, A_0},
764 : {1, O_RDWR, DENY_DOS, O_RDWR, DENY_NONE, A_RW},
765 : {1, O_RDWR, DENY_DOS, O_RDONLY, DENY_NONE, A_R},
766 : {1, O_RDWR, DENY_DOS, O_WRONLY, DENY_NONE, A_W},
767 : {1, O_RDWR, DENY_DOS, O_RDWR, DENY_FCB, A_0},
768 : {1, O_RDWR, DENY_DOS, O_RDONLY, DENY_FCB, A_0},
769 : {1, O_RDWR, DENY_DOS, O_WRONLY, DENY_FCB, A_0},
770 : {1, O_RDONLY, DENY_DOS, O_RDWR, DENY_DOS, A_RW},
771 : {1, O_RDONLY, DENY_DOS, O_RDONLY, DENY_DOS, A_R},
772 : {1, O_RDONLY, DENY_DOS, O_WRONLY, DENY_DOS, A_W},
773 : {1, O_RDONLY, DENY_DOS, O_RDWR, DENY_ALL, A_0},
774 : {1, O_RDONLY, DENY_DOS, O_RDONLY, DENY_ALL, A_0},
775 : {1, O_RDONLY, DENY_DOS, O_WRONLY, DENY_ALL, A_0},
776 : {1, O_RDONLY, DENY_DOS, O_RDWR, DENY_WRITE, A_RW},
777 : {1, O_RDONLY, DENY_DOS, O_RDONLY, DENY_WRITE, A_R},
778 : {1, O_RDONLY, DENY_DOS, O_WRONLY, DENY_WRITE, A_W},
779 : {1, O_RDONLY, DENY_DOS, O_RDWR, DENY_READ, A_0},
780 : {1, O_RDONLY, DENY_DOS, O_RDONLY, DENY_READ, A_0},
781 : {1, O_RDONLY, DENY_DOS, O_WRONLY, DENY_READ, A_0},
782 : {1, O_RDONLY, DENY_DOS, O_RDWR, DENY_NONE, A_RW},
783 : {1, O_RDONLY, DENY_DOS, O_RDONLY, DENY_NONE, A_R},
784 : {1, O_RDONLY, DENY_DOS, O_WRONLY, DENY_NONE, A_W},
785 : {1, O_RDONLY, DENY_DOS, O_RDWR, DENY_FCB, A_0},
786 : {1, O_RDONLY, DENY_DOS, O_RDONLY, DENY_FCB, A_0},
787 : {1, O_RDONLY, DENY_DOS, O_WRONLY, DENY_FCB, A_0},
788 : {1, O_WRONLY, DENY_DOS, O_RDWR, DENY_DOS, A_RW},
789 : {1, O_WRONLY, DENY_DOS, O_RDONLY, DENY_DOS, A_R},
790 : {1, O_WRONLY, DENY_DOS, O_WRONLY, DENY_DOS, A_W},
791 : {1, O_WRONLY, DENY_DOS, O_RDWR, DENY_ALL, A_0},
792 : {1, O_WRONLY, DENY_DOS, O_RDONLY, DENY_ALL, A_0},
793 : {1, O_WRONLY, DENY_DOS, O_WRONLY, DENY_ALL, A_0},
794 : {1, O_WRONLY, DENY_DOS, O_RDWR, DENY_WRITE, A_0},
795 : {1, O_WRONLY, DENY_DOS, O_RDONLY, DENY_WRITE, A_0},
796 : {1, O_WRONLY, DENY_DOS, O_WRONLY, DENY_WRITE, A_0},
797 : {1, O_WRONLY, DENY_DOS, O_RDWR, DENY_READ, A_RW},
798 : {1, O_WRONLY, DENY_DOS, O_RDONLY, DENY_READ, A_R},
799 : {1, O_WRONLY, DENY_DOS, O_WRONLY, DENY_READ, A_W},
800 : {1, O_WRONLY, DENY_DOS, O_RDWR, DENY_NONE, A_RW},
801 : {1, O_WRONLY, DENY_DOS, O_RDONLY, DENY_NONE, A_R},
802 : {1, O_WRONLY, DENY_DOS, O_WRONLY, DENY_NONE, A_W},
803 : {1, O_WRONLY, DENY_DOS, O_RDWR, DENY_FCB, A_0},
804 : {1, O_WRONLY, DENY_DOS, O_RDONLY, DENY_FCB, A_0},
805 : {1, O_WRONLY, DENY_DOS, O_WRONLY, DENY_FCB, A_0},
806 : {1, O_RDWR, DENY_ALL, O_RDWR, DENY_DOS, A_0},
807 : {1, O_RDWR, DENY_ALL, O_RDONLY, DENY_DOS, A_0},
808 : {1, O_RDWR, DENY_ALL, O_WRONLY, DENY_DOS, A_0},
809 : {1, O_RDWR, DENY_ALL, O_RDWR, DENY_ALL, A_0},
810 : {1, O_RDWR, DENY_ALL, O_RDONLY, DENY_ALL, A_0},
811 : {1, O_RDWR, DENY_ALL, O_WRONLY, DENY_ALL, A_0},
812 : {1, O_RDWR, DENY_ALL, O_RDWR, DENY_WRITE, A_0},
813 : {1, O_RDWR, DENY_ALL, O_RDONLY, DENY_WRITE, A_0},
814 : {1, O_RDWR, DENY_ALL, O_WRONLY, DENY_WRITE, A_0},
815 : {1, O_RDWR, DENY_ALL, O_RDWR, DENY_READ, A_0},
816 : {1, O_RDWR, DENY_ALL, O_RDONLY, DENY_READ, A_0},
817 : {1, O_RDWR, DENY_ALL, O_WRONLY, DENY_READ, A_0},
818 : {1, O_RDWR, DENY_ALL, O_RDWR, DENY_NONE, A_0},
819 : {1, O_RDWR, DENY_ALL, O_RDONLY, DENY_NONE, A_0},
820 : {1, O_RDWR, DENY_ALL, O_WRONLY, DENY_NONE, A_0},
821 : {1, O_RDWR, DENY_ALL, O_RDWR, DENY_FCB, A_0},
822 : {1, O_RDWR, DENY_ALL, O_RDONLY, DENY_FCB, A_0},
823 : {1, O_RDWR, DENY_ALL, O_WRONLY, DENY_FCB, A_0},
824 : {1, O_RDONLY, DENY_ALL, O_RDWR, DENY_DOS, A_0},
825 : {1, O_RDONLY, DENY_ALL, O_RDONLY, DENY_DOS, A_0},
826 : {1, O_RDONLY, DENY_ALL, O_WRONLY, DENY_DOS, A_0},
827 : {1, O_RDONLY, DENY_ALL, O_RDWR, DENY_ALL, A_0},
828 : {1, O_RDONLY, DENY_ALL, O_RDONLY, DENY_ALL, A_0},
829 : {1, O_RDONLY, DENY_ALL, O_WRONLY, DENY_ALL, A_0},
830 : {1, O_RDONLY, DENY_ALL, O_RDWR, DENY_WRITE, A_0},
831 : {1, O_RDONLY, DENY_ALL, O_RDONLY, DENY_WRITE, A_0},
832 : {1, O_RDONLY, DENY_ALL, O_WRONLY, DENY_WRITE, A_0},
833 : {1, O_RDONLY, DENY_ALL, O_RDWR, DENY_READ, A_0},
834 : {1, O_RDONLY, DENY_ALL, O_RDONLY, DENY_READ, A_0},
835 : {1, O_RDONLY, DENY_ALL, O_WRONLY, DENY_READ, A_0},
836 : {1, O_RDONLY, DENY_ALL, O_RDWR, DENY_NONE, A_0},
837 : {1, O_RDONLY, DENY_ALL, O_RDONLY, DENY_NONE, A_0},
838 : {1, O_RDONLY, DENY_ALL, O_WRONLY, DENY_NONE, A_0},
839 : {1, O_RDONLY, DENY_ALL, O_RDWR, DENY_FCB, A_0},
840 : {1, O_RDONLY, DENY_ALL, O_RDONLY, DENY_FCB, A_0},
841 : {1, O_RDONLY, DENY_ALL, O_WRONLY, DENY_FCB, A_0},
842 : {1, O_WRONLY, DENY_ALL, O_RDWR, DENY_DOS, A_0},
843 : {1, O_WRONLY, DENY_ALL, O_RDONLY, DENY_DOS, A_0},
844 : {1, O_WRONLY, DENY_ALL, O_WRONLY, DENY_DOS, A_0},
845 : {1, O_WRONLY, DENY_ALL, O_RDWR, DENY_ALL, A_0},
846 : {1, O_WRONLY, DENY_ALL, O_RDONLY, DENY_ALL, A_0},
847 : {1, O_WRONLY, DENY_ALL, O_WRONLY, DENY_ALL, A_0},
848 : {1, O_WRONLY, DENY_ALL, O_RDWR, DENY_WRITE, A_0},
849 : {1, O_WRONLY, DENY_ALL, O_RDONLY, DENY_WRITE, A_0},
850 : {1, O_WRONLY, DENY_ALL, O_WRONLY, DENY_WRITE, A_0},
851 : {1, O_WRONLY, DENY_ALL, O_RDWR, DENY_READ, A_0},
852 : {1, O_WRONLY, DENY_ALL, O_RDONLY, DENY_READ, A_0},
853 : {1, O_WRONLY, DENY_ALL, O_WRONLY, DENY_READ, A_0},
854 : {1, O_WRONLY, DENY_ALL, O_RDWR, DENY_NONE, A_0},
855 : {1, O_WRONLY, DENY_ALL, O_RDONLY, DENY_NONE, A_0},
856 : {1, O_WRONLY, DENY_ALL, O_WRONLY, DENY_NONE, A_0},
857 : {1, O_WRONLY, DENY_ALL, O_RDWR, DENY_FCB, A_0},
858 : {1, O_WRONLY, DENY_ALL, O_RDONLY, DENY_FCB, A_0},
859 : {1, O_WRONLY, DENY_ALL, O_WRONLY, DENY_FCB, A_0},
860 : {1, O_RDWR, DENY_WRITE, O_RDWR, DENY_DOS, A_0},
861 : {1, O_RDWR, DENY_WRITE, O_RDONLY, DENY_DOS, A_R},
862 : {1, O_RDWR, DENY_WRITE, O_WRONLY, DENY_DOS, A_0},
863 : {1, O_RDWR, DENY_WRITE, O_RDWR, DENY_ALL, A_0},
864 : {1, O_RDWR, DENY_WRITE, O_RDONLY, DENY_ALL, A_0},
865 : {1, O_RDWR, DENY_WRITE, O_WRONLY, DENY_ALL, A_0},
866 : {1, O_RDWR, DENY_WRITE, O_RDWR, DENY_WRITE, A_0},
867 : {1, O_RDWR, DENY_WRITE, O_RDONLY, DENY_WRITE, A_0},
868 : {1, O_RDWR, DENY_WRITE, O_WRONLY, DENY_WRITE, A_0},
869 : {1, O_RDWR, DENY_WRITE, O_RDWR, DENY_READ, A_0},
870 : {1, O_RDWR, DENY_WRITE, O_RDONLY, DENY_READ, A_0},
871 : {1, O_RDWR, DENY_WRITE, O_WRONLY, DENY_READ, A_0},
872 : {1, O_RDWR, DENY_WRITE, O_RDWR, DENY_NONE, A_0},
873 : {1, O_RDWR, DENY_WRITE, O_RDONLY, DENY_NONE, A_R},
874 : {1, O_RDWR, DENY_WRITE, O_WRONLY, DENY_NONE, A_0},
875 : {1, O_RDWR, DENY_WRITE, O_RDWR, DENY_FCB, A_0},
876 : {1, O_RDWR, DENY_WRITE, O_RDONLY, DENY_FCB, A_0},
877 : {1, O_RDWR, DENY_WRITE, O_WRONLY, DENY_FCB, A_0},
878 : {1, O_RDONLY, DENY_WRITE, O_RDWR, DENY_DOS, A_0},
879 : {1, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_DOS, A_R},
880 : {1, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_DOS, A_0},
881 : {1, O_RDONLY, DENY_WRITE, O_RDWR, DENY_ALL, A_0},
882 : {1, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_ALL, A_0},
883 : {1, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_ALL, A_0},
884 : {1, O_RDONLY, DENY_WRITE, O_RDWR, DENY_WRITE, A_0},
885 : {1, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_WRITE, A_R},
886 : {1, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_WRITE, A_0},
887 : {1, O_RDONLY, DENY_WRITE, O_RDWR, DENY_READ, A_0},
888 : {1, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_READ, A_0},
889 : {1, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_READ, A_0},
890 : {1, O_RDONLY, DENY_WRITE, O_RDWR, DENY_NONE, A_0},
891 : {1, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_NONE, A_R},
892 : {1, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_NONE, A_0},
893 : {1, O_RDONLY, DENY_WRITE, O_RDWR, DENY_FCB, A_0},
894 : {1, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_FCB, A_0},
895 : {1, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_FCB, A_0},
896 : {1, O_WRONLY, DENY_WRITE, O_RDWR, DENY_DOS, A_0},
897 : {1, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_DOS, A_R},
898 : {1, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_DOS, A_0},
899 : {1, O_WRONLY, DENY_WRITE, O_RDWR, DENY_ALL, A_0},
900 : {1, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_ALL, A_0},
901 : {1, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_ALL, A_0},
902 : {1, O_WRONLY, DENY_WRITE, O_RDWR, DENY_WRITE, A_0},
903 : {1, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_WRITE, A_0},
904 : {1, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_WRITE, A_0},
905 : {1, O_WRONLY, DENY_WRITE, O_RDWR, DENY_READ, A_0},
906 : {1, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_READ, A_R},
907 : {1, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_READ, A_0},
908 : {1, O_WRONLY, DENY_WRITE, O_RDWR, DENY_NONE, A_0},
909 : {1, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_NONE, A_R},
910 : {1, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_NONE, A_0},
911 : {1, O_WRONLY, DENY_WRITE, O_RDWR, DENY_FCB, A_0},
912 : {1, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_FCB, A_0},
913 : {1, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_FCB, A_0},
914 : {1, O_RDWR, DENY_READ, O_RDWR, DENY_DOS, A_0},
915 : {1, O_RDWR, DENY_READ, O_RDONLY, DENY_DOS, A_0},
916 : {1, O_RDWR, DENY_READ, O_WRONLY, DENY_DOS, A_W},
917 : {1, O_RDWR, DENY_READ, O_RDWR, DENY_ALL, A_0},
918 : {1, O_RDWR, DENY_READ, O_RDONLY, DENY_ALL, A_0},
919 : {1, O_RDWR, DENY_READ, O_WRONLY, DENY_ALL, A_0},
920 : {1, O_RDWR, DENY_READ, O_RDWR, DENY_WRITE, A_0},
921 : {1, O_RDWR, DENY_READ, O_RDONLY, DENY_WRITE, A_0},
922 : {1, O_RDWR, DENY_READ, O_WRONLY, DENY_WRITE, A_0},
923 : {1, O_RDWR, DENY_READ, O_RDWR, DENY_READ, A_0},
924 : {1, O_RDWR, DENY_READ, O_RDONLY, DENY_READ, A_0},
925 : {1, O_RDWR, DENY_READ, O_WRONLY, DENY_READ, A_0},
926 : {1, O_RDWR, DENY_READ, O_RDWR, DENY_NONE, A_0},
927 : {1, O_RDWR, DENY_READ, O_RDONLY, DENY_NONE, A_0},
928 : {1, O_RDWR, DENY_READ, O_WRONLY, DENY_NONE, A_W},
929 : {1, O_RDWR, DENY_READ, O_RDWR, DENY_FCB, A_0},
930 : {1, O_RDWR, DENY_READ, O_RDONLY, DENY_FCB, A_0},
931 : {1, O_RDWR, DENY_READ, O_WRONLY, DENY_FCB, A_0},
932 : {1, O_RDONLY, DENY_READ, O_RDWR, DENY_DOS, A_0},
933 : {1, O_RDONLY, DENY_READ, O_RDONLY, DENY_DOS, A_0},
934 : {1, O_RDONLY, DENY_READ, O_WRONLY, DENY_DOS, A_W},
935 : {1, O_RDONLY, DENY_READ, O_RDWR, DENY_ALL, A_0},
936 : {1, O_RDONLY, DENY_READ, O_RDONLY, DENY_ALL, A_0},
937 : {1, O_RDONLY, DENY_READ, O_WRONLY, DENY_ALL, A_0},
938 : {1, O_RDONLY, DENY_READ, O_RDWR, DENY_WRITE, A_0},
939 : {1, O_RDONLY, DENY_READ, O_RDONLY, DENY_WRITE, A_0},
940 : {1, O_RDONLY, DENY_READ, O_WRONLY, DENY_WRITE, A_W},
941 : {1, O_RDONLY, DENY_READ, O_RDWR, DENY_READ, A_0},
942 : {1, O_RDONLY, DENY_READ, O_RDONLY, DENY_READ, A_0},
943 : {1, O_RDONLY, DENY_READ, O_WRONLY, DENY_READ, A_0},
944 : {1, O_RDONLY, DENY_READ, O_RDWR, DENY_NONE, A_0},
945 : {1, O_RDONLY, DENY_READ, O_RDONLY, DENY_NONE, A_0},
946 : {1, O_RDONLY, DENY_READ, O_WRONLY, DENY_NONE, A_W},
947 : {1, O_RDONLY, DENY_READ, O_RDWR, DENY_FCB, A_0},
948 : {1, O_RDONLY, DENY_READ, O_RDONLY, DENY_FCB, A_0},
949 : {1, O_RDONLY, DENY_READ, O_WRONLY, DENY_FCB, A_0},
950 : {1, O_WRONLY, DENY_READ, O_RDWR, DENY_DOS, A_0},
951 : {1, O_WRONLY, DENY_READ, O_RDONLY, DENY_DOS, A_0},
952 : {1, O_WRONLY, DENY_READ, O_WRONLY, DENY_DOS, A_W},
953 : {1, O_WRONLY, DENY_READ, O_RDWR, DENY_ALL, A_0},
954 : {1, O_WRONLY, DENY_READ, O_RDONLY, DENY_ALL, A_0},
955 : {1, O_WRONLY, DENY_READ, O_WRONLY, DENY_ALL, A_0},
956 : {1, O_WRONLY, DENY_READ, O_RDWR, DENY_WRITE, A_0},
957 : {1, O_WRONLY, DENY_READ, O_RDONLY, DENY_WRITE, A_0},
958 : {1, O_WRONLY, DENY_READ, O_WRONLY, DENY_WRITE, A_0},
959 : {1, O_WRONLY, DENY_READ, O_RDWR, DENY_READ, A_0},
960 : {1, O_WRONLY, DENY_READ, O_RDONLY, DENY_READ, A_0},
961 : {1, O_WRONLY, DENY_READ, O_WRONLY, DENY_READ, A_W},
962 : {1, O_WRONLY, DENY_READ, O_RDWR, DENY_NONE, A_0},
963 : {1, O_WRONLY, DENY_READ, O_RDONLY, DENY_NONE, A_0},
964 : {1, O_WRONLY, DENY_READ, O_WRONLY, DENY_NONE, A_W},
965 : {1, O_WRONLY, DENY_READ, O_RDWR, DENY_FCB, A_0},
966 : {1, O_WRONLY, DENY_READ, O_RDONLY, DENY_FCB, A_0},
967 : {1, O_WRONLY, DENY_READ, O_WRONLY, DENY_FCB, A_0},
968 : {1, O_RDWR, DENY_NONE, O_RDWR, DENY_DOS, A_RW},
969 : {1, O_RDWR, DENY_NONE, O_RDONLY, DENY_DOS, A_R},
970 : {1, O_RDWR, DENY_NONE, O_WRONLY, DENY_DOS, A_W},
971 : {1, O_RDWR, DENY_NONE, O_RDWR, DENY_ALL, A_0},
972 : {1, O_RDWR, DENY_NONE, O_RDONLY, DENY_ALL, A_0},
973 : {1, O_RDWR, DENY_NONE, O_WRONLY, DENY_ALL, A_0},
974 : {1, O_RDWR, DENY_NONE, O_RDWR, DENY_WRITE, A_0},
975 : {1, O_RDWR, DENY_NONE, O_RDONLY, DENY_WRITE, A_0},
976 : {1, O_RDWR, DENY_NONE, O_WRONLY, DENY_WRITE, A_0},
977 : {1, O_RDWR, DENY_NONE, O_RDWR, DENY_READ, A_0},
978 : {1, O_RDWR, DENY_NONE, O_RDONLY, DENY_READ, A_0},
979 : {1, O_RDWR, DENY_NONE, O_WRONLY, DENY_READ, A_0},
980 : {1, O_RDWR, DENY_NONE, O_RDWR, DENY_NONE, A_RW},
981 : {1, O_RDWR, DENY_NONE, O_RDONLY, DENY_NONE, A_R},
982 : {1, O_RDWR, DENY_NONE, O_WRONLY, DENY_NONE, A_W},
983 : {1, O_RDWR, DENY_NONE, O_RDWR, DENY_FCB, A_0},
984 : {1, O_RDWR, DENY_NONE, O_RDONLY, DENY_FCB, A_0},
985 : {1, O_RDWR, DENY_NONE, O_WRONLY, DENY_FCB, A_0},
986 : {1, O_RDONLY, DENY_NONE, O_RDWR, DENY_DOS, A_RW},
987 : {1, O_RDONLY, DENY_NONE, O_RDONLY, DENY_DOS, A_R},
988 : {1, O_RDONLY, DENY_NONE, O_WRONLY, DENY_DOS, A_W},
989 : {1, O_RDONLY, DENY_NONE, O_RDWR, DENY_ALL, A_0},
990 : {1, O_RDONLY, DENY_NONE, O_RDONLY, DENY_ALL, A_0},
991 : {1, O_RDONLY, DENY_NONE, O_WRONLY, DENY_ALL, A_0},
992 : {1, O_RDONLY, DENY_NONE, O_RDWR, DENY_WRITE, A_RW},
993 : {1, O_RDONLY, DENY_NONE, O_RDONLY, DENY_WRITE, A_R},
994 : {1, O_RDONLY, DENY_NONE, O_WRONLY, DENY_WRITE, A_W},
995 : {1, O_RDONLY, DENY_NONE, O_RDWR, DENY_READ, A_0},
996 : {1, O_RDONLY, DENY_NONE, O_RDONLY, DENY_READ, A_0},
997 : {1, O_RDONLY, DENY_NONE, O_WRONLY, DENY_READ, A_0},
998 : {1, O_RDONLY, DENY_NONE, O_RDWR, DENY_NONE, A_RW},
999 : {1, O_RDONLY, DENY_NONE, O_RDONLY, DENY_NONE, A_R},
1000 : {1, O_RDONLY, DENY_NONE, O_WRONLY, DENY_NONE, A_W},
1001 : {1, O_RDONLY, DENY_NONE, O_RDWR, DENY_FCB, A_0},
1002 : {1, O_RDONLY, DENY_NONE, O_RDONLY, DENY_FCB, A_0},
1003 : {1, O_RDONLY, DENY_NONE, O_WRONLY, DENY_FCB, A_0},
1004 : {1, O_WRONLY, DENY_NONE, O_RDWR, DENY_DOS, A_RW},
1005 : {1, O_WRONLY, DENY_NONE, O_RDONLY, DENY_DOS, A_R},
1006 : {1, O_WRONLY, DENY_NONE, O_WRONLY, DENY_DOS, A_W},
1007 : {1, O_WRONLY, DENY_NONE, O_RDWR, DENY_ALL, A_0},
1008 : {1, O_WRONLY, DENY_NONE, O_RDONLY, DENY_ALL, A_0},
1009 : {1, O_WRONLY, DENY_NONE, O_WRONLY, DENY_ALL, A_0},
1010 : {1, O_WRONLY, DENY_NONE, O_RDWR, DENY_WRITE, A_0},
1011 : {1, O_WRONLY, DENY_NONE, O_RDONLY, DENY_WRITE, A_0},
1012 : {1, O_WRONLY, DENY_NONE, O_WRONLY, DENY_WRITE, A_0},
1013 : {1, O_WRONLY, DENY_NONE, O_RDWR, DENY_READ, A_RW},
1014 : {1, O_WRONLY, DENY_NONE, O_RDONLY, DENY_READ, A_R},
1015 : {1, O_WRONLY, DENY_NONE, O_WRONLY, DENY_READ, A_W},
1016 : {1, O_WRONLY, DENY_NONE, O_RDWR, DENY_NONE, A_RW},
1017 : {1, O_WRONLY, DENY_NONE, O_RDONLY, DENY_NONE, A_R},
1018 : {1, O_WRONLY, DENY_NONE, O_WRONLY, DENY_NONE, A_W},
1019 : {1, O_WRONLY, DENY_NONE, O_RDWR, DENY_FCB, A_0},
1020 : {1, O_WRONLY, DENY_NONE, O_RDONLY, DENY_FCB, A_0},
1021 : {1, O_WRONLY, DENY_NONE, O_WRONLY, DENY_FCB, A_0},
1022 : {1, O_RDWR, DENY_FCB, O_RDWR, DENY_DOS, A_RW},
1023 : {1, O_RDWR, DENY_FCB, O_RDONLY, DENY_DOS, A_R},
1024 : {1, O_RDWR, DENY_FCB, O_WRONLY, DENY_DOS, A_W},
1025 : {1, O_RDWR, DENY_FCB, O_RDWR, DENY_ALL, A_0},
1026 : {1, O_RDWR, DENY_FCB, O_RDONLY, DENY_ALL, A_0},
1027 : {1, O_RDWR, DENY_FCB, O_WRONLY, DENY_ALL, A_0},
1028 : {1, O_RDWR, DENY_FCB, O_RDWR, DENY_WRITE, A_0},
1029 : {1, O_RDWR, DENY_FCB, O_RDONLY, DENY_WRITE, A_0},
1030 : {1, O_RDWR, DENY_FCB, O_WRONLY, DENY_WRITE, A_0},
1031 : {1, O_RDWR, DENY_FCB, O_RDWR, DENY_READ, A_0},
1032 : {1, O_RDWR, DENY_FCB, O_RDONLY, DENY_READ, A_0},
1033 : {1, O_RDWR, DENY_FCB, O_WRONLY, DENY_READ, A_0},
1034 : {1, O_RDWR, DENY_FCB, O_RDWR, DENY_NONE, A_0},
1035 : {1, O_RDWR, DENY_FCB, O_RDONLY, DENY_NONE, A_0},
1036 : {1, O_RDWR, DENY_FCB, O_WRONLY, DENY_NONE, A_0},
1037 : {1, O_RDWR, DENY_FCB, O_RDWR, DENY_FCB, A_RW},
1038 : {1, O_RDWR, DENY_FCB, O_RDONLY, DENY_FCB, A_RW},
1039 : {1, O_RDWR, DENY_FCB, O_WRONLY, DENY_FCB, A_RW},
1040 : {1, O_RDONLY, DENY_FCB, O_RDWR, DENY_DOS, A_RW},
1041 : {1, O_RDONLY, DENY_FCB, O_RDONLY, DENY_DOS, A_R},
1042 : {1, O_RDONLY, DENY_FCB, O_WRONLY, DENY_DOS, A_W},
1043 : {1, O_RDONLY, DENY_FCB, O_RDWR, DENY_ALL, A_0},
1044 : {1, O_RDONLY, DENY_FCB, O_RDONLY, DENY_ALL, A_0},
1045 : {1, O_RDONLY, DENY_FCB, O_WRONLY, DENY_ALL, A_0},
1046 : {1, O_RDONLY, DENY_FCB, O_RDWR, DENY_WRITE, A_0},
1047 : {1, O_RDONLY, DENY_FCB, O_RDONLY, DENY_WRITE, A_0},
1048 : {1, O_RDONLY, DENY_FCB, O_WRONLY, DENY_WRITE, A_0},
1049 : {1, O_RDONLY, DENY_FCB, O_RDWR, DENY_READ, A_0},
1050 : {1, O_RDONLY, DENY_FCB, O_RDONLY, DENY_READ, A_0},
1051 : {1, O_RDONLY, DENY_FCB, O_WRONLY, DENY_READ, A_0},
1052 : {1, O_RDONLY, DENY_FCB, O_RDWR, DENY_NONE, A_0},
1053 : {1, O_RDONLY, DENY_FCB, O_RDONLY, DENY_NONE, A_0},
1054 : {1, O_RDONLY, DENY_FCB, O_WRONLY, DENY_NONE, A_0},
1055 : {1, O_RDONLY, DENY_FCB, O_RDWR, DENY_FCB, A_RW},
1056 : {1, O_RDONLY, DENY_FCB, O_RDONLY, DENY_FCB, A_RW},
1057 : {1, O_RDONLY, DENY_FCB, O_WRONLY, DENY_FCB, A_RW},
1058 : {1, O_WRONLY, DENY_FCB, O_RDWR, DENY_DOS, A_RW},
1059 : {1, O_WRONLY, DENY_FCB, O_RDONLY, DENY_DOS, A_R},
1060 : {1, O_WRONLY, DENY_FCB, O_WRONLY, DENY_DOS, A_W},
1061 : {1, O_WRONLY, DENY_FCB, O_RDWR, DENY_ALL, A_0},
1062 : {1, O_WRONLY, DENY_FCB, O_RDONLY, DENY_ALL, A_0},
1063 : {1, O_WRONLY, DENY_FCB, O_WRONLY, DENY_ALL, A_0},
1064 : {1, O_WRONLY, DENY_FCB, O_RDWR, DENY_WRITE, A_0},
1065 : {1, O_WRONLY, DENY_FCB, O_RDONLY, DENY_WRITE, A_0},
1066 : {1, O_WRONLY, DENY_FCB, O_WRONLY, DENY_WRITE, A_0},
1067 : {1, O_WRONLY, DENY_FCB, O_RDWR, DENY_READ, A_0},
1068 : {1, O_WRONLY, DENY_FCB, O_RDONLY, DENY_READ, A_0},
1069 : {1, O_WRONLY, DENY_FCB, O_WRONLY, DENY_READ, A_0},
1070 : {1, O_WRONLY, DENY_FCB, O_RDWR, DENY_NONE, A_0},
1071 : {1, O_WRONLY, DENY_FCB, O_RDONLY, DENY_NONE, A_0},
1072 : {1, O_WRONLY, DENY_FCB, O_WRONLY, DENY_NONE, A_0},
1073 : {1, O_WRONLY, DENY_FCB, O_RDWR, DENY_FCB, A_RW},
1074 : {1, O_WRONLY, DENY_FCB, O_RDONLY, DENY_FCB, A_RW},
1075 : {1, O_WRONLY, DENY_FCB, O_WRONLY, DENY_FCB, A_RW},
1076 : {0, O_RDWR, DENY_DOS, O_RDWR, DENY_DOS, A_RW},
1077 : {0, O_RDWR, DENY_DOS, O_RDONLY, DENY_DOS, A_R},
1078 : {0, O_RDWR, DENY_DOS, O_WRONLY, DENY_DOS, A_W},
1079 : {0, O_RDWR, DENY_DOS, O_RDWR, DENY_ALL, A_0},
1080 : {0, O_RDWR, DENY_DOS, O_RDONLY, DENY_ALL, A_0},
1081 : {0, O_RDWR, DENY_DOS, O_WRONLY, DENY_ALL, A_0},
1082 : {0, O_RDWR, DENY_DOS, O_RDWR, DENY_WRITE, A_0},
1083 : {0, O_RDWR, DENY_DOS, O_RDONLY, DENY_WRITE, A_0},
1084 : {0, O_RDWR, DENY_DOS, O_WRONLY, DENY_WRITE, A_0},
1085 : {0, O_RDWR, DENY_DOS, O_RDWR, DENY_READ, A_0},
1086 : {0, O_RDWR, DENY_DOS, O_RDONLY, DENY_READ, A_0},
1087 : {0, O_RDWR, DENY_DOS, O_WRONLY, DENY_READ, A_0},
1088 : {0, O_RDWR, DENY_DOS, O_RDWR, DENY_NONE, A_0},
1089 : {0, O_RDWR, DENY_DOS, O_RDONLY, DENY_NONE, A_0},
1090 : {0, O_RDWR, DENY_DOS, O_WRONLY, DENY_NONE, A_0},
1091 : {0, O_RDWR, DENY_DOS, O_RDWR, DENY_FCB, A_RW},
1092 : {0, O_RDWR, DENY_DOS, O_RDONLY, DENY_FCB, A_RW},
1093 : {0, O_RDWR, DENY_DOS, O_WRONLY, DENY_FCB, A_RW},
1094 : {0, O_RDONLY, DENY_DOS, O_RDWR, DENY_DOS, A_0},
1095 : {0, O_RDONLY, DENY_DOS, O_RDONLY, DENY_DOS, A_R},
1096 : {0, O_RDONLY, DENY_DOS, O_WRONLY, DENY_DOS, A_0},
1097 : {0, O_RDONLY, DENY_DOS, O_RDWR, DENY_ALL, A_0},
1098 : {0, O_RDONLY, DENY_DOS, O_RDONLY, DENY_ALL, A_0},
1099 : {0, O_RDONLY, DENY_DOS, O_WRONLY, DENY_ALL, A_0},
1100 : {0, O_RDONLY, DENY_DOS, O_RDWR, DENY_WRITE, A_0},
1101 : {0, O_RDONLY, DENY_DOS, O_RDONLY, DENY_WRITE, A_R},
1102 : {0, O_RDONLY, DENY_DOS, O_WRONLY, DENY_WRITE, A_0},
1103 : {0, O_RDONLY, DENY_DOS, O_RDWR, DENY_READ, A_0},
1104 : {0, O_RDONLY, DENY_DOS, O_RDONLY, DENY_READ, A_0},
1105 : {0, O_RDONLY, DENY_DOS, O_WRONLY, DENY_READ, A_0},
1106 : {0, O_RDONLY, DENY_DOS, O_RDWR, DENY_NONE, A_0},
1107 : {0, O_RDONLY, DENY_DOS, O_RDONLY, DENY_NONE, A_R},
1108 : {0, O_RDONLY, DENY_DOS, O_WRONLY, DENY_NONE, A_0},
1109 : {0, O_RDONLY, DENY_DOS, O_RDWR, DENY_FCB, A_0},
1110 : {0, O_RDONLY, DENY_DOS, O_RDONLY, DENY_FCB, A_0},
1111 : {0, O_RDONLY, DENY_DOS, O_WRONLY, DENY_FCB, A_0},
1112 : {0, O_WRONLY, DENY_DOS, O_RDWR, DENY_DOS, A_RW},
1113 : {0, O_WRONLY, DENY_DOS, O_RDONLY, DENY_DOS, A_R},
1114 : {0, O_WRONLY, DENY_DOS, O_WRONLY, DENY_DOS, A_W},
1115 : {0, O_WRONLY, DENY_DOS, O_RDWR, DENY_ALL, A_0},
1116 : {0, O_WRONLY, DENY_DOS, O_RDONLY, DENY_ALL, A_0},
1117 : {0, O_WRONLY, DENY_DOS, O_WRONLY, DENY_ALL, A_0},
1118 : {0, O_WRONLY, DENY_DOS, O_RDWR, DENY_WRITE, A_0},
1119 : {0, O_WRONLY, DENY_DOS, O_RDONLY, DENY_WRITE, A_0},
1120 : {0, O_WRONLY, DENY_DOS, O_WRONLY, DENY_WRITE, A_0},
1121 : {0, O_WRONLY, DENY_DOS, O_RDWR, DENY_READ, A_0},
1122 : {0, O_WRONLY, DENY_DOS, O_RDONLY, DENY_READ, A_0},
1123 : {0, O_WRONLY, DENY_DOS, O_WRONLY, DENY_READ, A_0},
1124 : {0, O_WRONLY, DENY_DOS, O_RDWR, DENY_NONE, A_0},
1125 : {0, O_WRONLY, DENY_DOS, O_RDONLY, DENY_NONE, A_0},
1126 : {0, O_WRONLY, DENY_DOS, O_WRONLY, DENY_NONE, A_0},
1127 : {0, O_WRONLY, DENY_DOS, O_RDWR, DENY_FCB, A_RW},
1128 : {0, O_WRONLY, DENY_DOS, O_RDONLY, DENY_FCB, A_RW},
1129 : {0, O_WRONLY, DENY_DOS, O_WRONLY, DENY_FCB, A_RW},
1130 : {0, O_RDWR, DENY_ALL, O_RDWR, DENY_DOS, A_0},
1131 : {0, O_RDWR, DENY_ALL, O_RDONLY, DENY_DOS, A_0},
1132 : {0, O_RDWR, DENY_ALL, O_WRONLY, DENY_DOS, A_0},
1133 : {0, O_RDWR, DENY_ALL, O_RDWR, DENY_ALL, A_0},
1134 : {0, O_RDWR, DENY_ALL, O_RDONLY, DENY_ALL, A_0},
1135 : {0, O_RDWR, DENY_ALL, O_WRONLY, DENY_ALL, A_0},
1136 : {0, O_RDWR, DENY_ALL, O_RDWR, DENY_WRITE, A_0},
1137 : {0, O_RDWR, DENY_ALL, O_RDONLY, DENY_WRITE, A_0},
1138 : {0, O_RDWR, DENY_ALL, O_WRONLY, DENY_WRITE, A_0},
1139 : {0, O_RDWR, DENY_ALL, O_RDWR, DENY_READ, A_0},
1140 : {0, O_RDWR, DENY_ALL, O_RDONLY, DENY_READ, A_0},
1141 : {0, O_RDWR, DENY_ALL, O_WRONLY, DENY_READ, A_0},
1142 : {0, O_RDWR, DENY_ALL, O_RDWR, DENY_NONE, A_0},
1143 : {0, O_RDWR, DENY_ALL, O_RDONLY, DENY_NONE, A_0},
1144 : {0, O_RDWR, DENY_ALL, O_WRONLY, DENY_NONE, A_0},
1145 : {0, O_RDWR, DENY_ALL, O_RDWR, DENY_FCB, A_0},
1146 : {0, O_RDWR, DENY_ALL, O_RDONLY, DENY_FCB, A_0},
1147 : {0, O_RDWR, DENY_ALL, O_WRONLY, DENY_FCB, A_0},
1148 : {0, O_RDONLY, DENY_ALL, O_RDWR, DENY_DOS, A_0},
1149 : {0, O_RDONLY, DENY_ALL, O_RDONLY, DENY_DOS, A_0},
1150 : {0, O_RDONLY, DENY_ALL, O_WRONLY, DENY_DOS, A_0},
1151 : {0, O_RDONLY, DENY_ALL, O_RDWR, DENY_ALL, A_0},
1152 : {0, O_RDONLY, DENY_ALL, O_RDONLY, DENY_ALL, A_0},
1153 : {0, O_RDONLY, DENY_ALL, O_WRONLY, DENY_ALL, A_0},
1154 : {0, O_RDONLY, DENY_ALL, O_RDWR, DENY_WRITE, A_0},
1155 : {0, O_RDONLY, DENY_ALL, O_RDONLY, DENY_WRITE, A_0},
1156 : {0, O_RDONLY, DENY_ALL, O_WRONLY, DENY_WRITE, A_0},
1157 : {0, O_RDONLY, DENY_ALL, O_RDWR, DENY_READ, A_0},
1158 : {0, O_RDONLY, DENY_ALL, O_RDONLY, DENY_READ, A_0},
1159 : {0, O_RDONLY, DENY_ALL, O_WRONLY, DENY_READ, A_0},
1160 : {0, O_RDONLY, DENY_ALL, O_RDWR, DENY_NONE, A_0},
1161 : {0, O_RDONLY, DENY_ALL, O_RDONLY, DENY_NONE, A_0},
1162 : {0, O_RDONLY, DENY_ALL, O_WRONLY, DENY_NONE, A_0},
1163 : {0, O_RDONLY, DENY_ALL, O_RDWR, DENY_FCB, A_0},
1164 : {0, O_RDONLY, DENY_ALL, O_RDONLY, DENY_FCB, A_0},
1165 : {0, O_RDONLY, DENY_ALL, O_WRONLY, DENY_FCB, A_0},
1166 : {0, O_WRONLY, DENY_ALL, O_RDWR, DENY_DOS, A_0},
1167 : {0, O_WRONLY, DENY_ALL, O_RDONLY, DENY_DOS, A_0},
1168 : {0, O_WRONLY, DENY_ALL, O_WRONLY, DENY_DOS, A_0},
1169 : {0, O_WRONLY, DENY_ALL, O_RDWR, DENY_ALL, A_0},
1170 : {0, O_WRONLY, DENY_ALL, O_RDONLY, DENY_ALL, A_0},
1171 : {0, O_WRONLY, DENY_ALL, O_WRONLY, DENY_ALL, A_0},
1172 : {0, O_WRONLY, DENY_ALL, O_RDWR, DENY_WRITE, A_0},
1173 : {0, O_WRONLY, DENY_ALL, O_RDONLY, DENY_WRITE, A_0},
1174 : {0, O_WRONLY, DENY_ALL, O_WRONLY, DENY_WRITE, A_0},
1175 : {0, O_WRONLY, DENY_ALL, O_RDWR, DENY_READ, A_0},
1176 : {0, O_WRONLY, DENY_ALL, O_RDONLY, DENY_READ, A_0},
1177 : {0, O_WRONLY, DENY_ALL, O_WRONLY, DENY_READ, A_0},
1178 : {0, O_WRONLY, DENY_ALL, O_RDWR, DENY_NONE, A_0},
1179 : {0, O_WRONLY, DENY_ALL, O_RDONLY, DENY_NONE, A_0},
1180 : {0, O_WRONLY, DENY_ALL, O_WRONLY, DENY_NONE, A_0},
1181 : {0, O_WRONLY, DENY_ALL, O_RDWR, DENY_FCB, A_0},
1182 : {0, O_WRONLY, DENY_ALL, O_RDONLY, DENY_FCB, A_0},
1183 : {0, O_WRONLY, DENY_ALL, O_WRONLY, DENY_FCB, A_0},
1184 : {0, O_RDWR, DENY_WRITE, O_RDWR, DENY_DOS, A_0},
1185 : {0, O_RDWR, DENY_WRITE, O_RDONLY, DENY_DOS, A_0},
1186 : {0, O_RDWR, DENY_WRITE, O_WRONLY, DENY_DOS, A_0},
1187 : {0, O_RDWR, DENY_WRITE, O_RDWR, DENY_ALL, A_0},
1188 : {0, O_RDWR, DENY_WRITE, O_RDONLY, DENY_ALL, A_0},
1189 : {0, O_RDWR, DENY_WRITE, O_WRONLY, DENY_ALL, A_0},
1190 : {0, O_RDWR, DENY_WRITE, O_RDWR, DENY_WRITE, A_0},
1191 : {0, O_RDWR, DENY_WRITE, O_RDONLY, DENY_WRITE, A_0},
1192 : {0, O_RDWR, DENY_WRITE, O_WRONLY, DENY_WRITE, A_0},
1193 : {0, O_RDWR, DENY_WRITE, O_RDWR, DENY_READ, A_0},
1194 : {0, O_RDWR, DENY_WRITE, O_RDONLY, DENY_READ, A_0},
1195 : {0, O_RDWR, DENY_WRITE, O_WRONLY, DENY_READ, A_0},
1196 : {0, O_RDWR, DENY_WRITE, O_RDWR, DENY_NONE, A_0},
1197 : {0, O_RDWR, DENY_WRITE, O_RDONLY, DENY_NONE, A_R},
1198 : {0, O_RDWR, DENY_WRITE, O_WRONLY, DENY_NONE, A_0},
1199 : {0, O_RDWR, DENY_WRITE, O_RDWR, DENY_FCB, A_0},
1200 : {0, O_RDWR, DENY_WRITE, O_RDONLY, DENY_FCB, A_0},
1201 : {0, O_RDWR, DENY_WRITE, O_WRONLY, DENY_FCB, A_0},
1202 : {0, O_RDONLY, DENY_WRITE, O_RDWR, DENY_DOS, A_0},
1203 : {0, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_DOS, A_R},
1204 : {0, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_DOS, A_0},
1205 : {0, O_RDONLY, DENY_WRITE, O_RDWR, DENY_ALL, A_0},
1206 : {0, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_ALL, A_0},
1207 : {0, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_ALL, A_0},
1208 : {0, O_RDONLY, DENY_WRITE, O_RDWR, DENY_WRITE, A_0},
1209 : {0, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_WRITE, A_R},
1210 : {0, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_WRITE, A_0},
1211 : {0, O_RDONLY, DENY_WRITE, O_RDWR, DENY_READ, A_0},
1212 : {0, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_READ, A_0},
1213 : {0, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_READ, A_0},
1214 : {0, O_RDONLY, DENY_WRITE, O_RDWR, DENY_NONE, A_0},
1215 : {0, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_NONE, A_R},
1216 : {0, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_NONE, A_0},
1217 : {0, O_RDONLY, DENY_WRITE, O_RDWR, DENY_FCB, A_0},
1218 : {0, O_RDONLY, DENY_WRITE, O_RDONLY, DENY_FCB, A_0},
1219 : {0, O_RDONLY, DENY_WRITE, O_WRONLY, DENY_FCB, A_0},
1220 : {0, O_WRONLY, DENY_WRITE, O_RDWR, DENY_DOS, A_0},
1221 : {0, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_DOS, A_0},
1222 : {0, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_DOS, A_0},
1223 : {0, O_WRONLY, DENY_WRITE, O_RDWR, DENY_ALL, A_0},
1224 : {0, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_ALL, A_0},
1225 : {0, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_ALL, A_0},
1226 : {0, O_WRONLY, DENY_WRITE, O_RDWR, DENY_WRITE, A_0},
1227 : {0, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_WRITE, A_0},
1228 : {0, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_WRITE, A_0},
1229 : {0, O_WRONLY, DENY_WRITE, O_RDWR, DENY_READ, A_0},
1230 : {0, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_READ, A_R},
1231 : {0, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_READ, A_0},
1232 : {0, O_WRONLY, DENY_WRITE, O_RDWR, DENY_NONE, A_0},
1233 : {0, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_NONE, A_R},
1234 : {0, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_NONE, A_0},
1235 : {0, O_WRONLY, DENY_WRITE, O_RDWR, DENY_FCB, A_0},
1236 : {0, O_WRONLY, DENY_WRITE, O_RDONLY, DENY_FCB, A_0},
1237 : {0, O_WRONLY, DENY_WRITE, O_WRONLY, DENY_FCB, A_0},
1238 : {0, O_RDWR, DENY_READ, O_RDWR, DENY_DOS, A_0},
1239 : {0, O_RDWR, DENY_READ, O_RDONLY, DENY_DOS, A_0},
1240 : {0, O_RDWR, DENY_READ, O_WRONLY, DENY_DOS, A_0},
1241 : {0, O_RDWR, DENY_READ, O_RDWR, DENY_ALL, A_0},
1242 : {0, O_RDWR, DENY_READ, O_RDONLY, DENY_ALL, A_0},
1243 : {0, O_RDWR, DENY_READ, O_WRONLY, DENY_ALL, A_0},
1244 : {0, O_RDWR, DENY_READ, O_RDWR, DENY_WRITE, A_0},
1245 : {0, O_RDWR, DENY_READ, O_RDONLY, DENY_WRITE, A_0},
1246 : {0, O_RDWR, DENY_READ, O_WRONLY, DENY_WRITE, A_0},
1247 : {0, O_RDWR, DENY_READ, O_RDWR, DENY_READ, A_0},
1248 : {0, O_RDWR, DENY_READ, O_RDONLY, DENY_READ, A_0},
1249 : {0, O_RDWR, DENY_READ, O_WRONLY, DENY_READ, A_0},
1250 : {0, O_RDWR, DENY_READ, O_RDWR, DENY_NONE, A_0},
1251 : {0, O_RDWR, DENY_READ, O_RDONLY, DENY_NONE, A_0},
1252 : {0, O_RDWR, DENY_READ, O_WRONLY, DENY_NONE, A_W},
1253 : {0, O_RDWR, DENY_READ, O_RDWR, DENY_FCB, A_0},
1254 : {0, O_RDWR, DENY_READ, O_RDONLY, DENY_FCB, A_0},
1255 : {0, O_RDWR, DENY_READ, O_WRONLY, DENY_FCB, A_0},
1256 : {0, O_RDONLY, DENY_READ, O_RDWR, DENY_DOS, A_0},
1257 : {0, O_RDONLY, DENY_READ, O_RDONLY, DENY_DOS, A_0},
1258 : {0, O_RDONLY, DENY_READ, O_WRONLY, DENY_DOS, A_0},
1259 : {0, O_RDONLY, DENY_READ, O_RDWR, DENY_ALL, A_0},
1260 : {0, O_RDONLY, DENY_READ, O_RDONLY, DENY_ALL, A_0},
1261 : {0, O_RDONLY, DENY_READ, O_WRONLY, DENY_ALL, A_0},
1262 : {0, O_RDONLY, DENY_READ, O_RDWR, DENY_WRITE, A_0},
1263 : {0, O_RDONLY, DENY_READ, O_RDONLY, DENY_WRITE, A_0},
1264 : {0, O_RDONLY, DENY_READ, O_WRONLY, DENY_WRITE, A_W},
1265 : {0, O_RDONLY, DENY_READ, O_RDWR, DENY_READ, A_0},
1266 : {0, O_RDONLY, DENY_READ, O_RDONLY, DENY_READ, A_0},
1267 : {0, O_RDONLY, DENY_READ, O_WRONLY, DENY_READ, A_0},
1268 : {0, O_RDONLY, DENY_READ, O_RDWR, DENY_NONE, A_0},
1269 : {0, O_RDONLY, DENY_READ, O_RDONLY, DENY_NONE, A_0},
1270 : {0, O_RDONLY, DENY_READ, O_WRONLY, DENY_NONE, A_W},
1271 : {0, O_RDONLY, DENY_READ, O_RDWR, DENY_FCB, A_0},
1272 : {0, O_RDONLY, DENY_READ, O_RDONLY, DENY_FCB, A_0},
1273 : {0, O_RDONLY, DENY_READ, O_WRONLY, DENY_FCB, A_0},
1274 : {0, O_WRONLY, DENY_READ, O_RDWR, DENY_DOS, A_0},
1275 : {0, O_WRONLY, DENY_READ, O_RDONLY, DENY_DOS, A_0},
1276 : {0, O_WRONLY, DENY_READ, O_WRONLY, DENY_DOS, A_0},
1277 : {0, O_WRONLY, DENY_READ, O_RDWR, DENY_ALL, A_0},
1278 : {0, O_WRONLY, DENY_READ, O_RDONLY, DENY_ALL, A_0},
1279 : {0, O_WRONLY, DENY_READ, O_WRONLY, DENY_ALL, A_0},
1280 : {0, O_WRONLY, DENY_READ, O_RDWR, DENY_WRITE, A_0},
1281 : {0, O_WRONLY, DENY_READ, O_RDONLY, DENY_WRITE, A_0},
1282 : {0, O_WRONLY, DENY_READ, O_WRONLY, DENY_WRITE, A_0},
1283 : {0, O_WRONLY, DENY_READ, O_RDWR, DENY_READ, A_0},
1284 : {0, O_WRONLY, DENY_READ, O_RDONLY, DENY_READ, A_0},
1285 : {0, O_WRONLY, DENY_READ, O_WRONLY, DENY_READ, A_W},
1286 : {0, O_WRONLY, DENY_READ, O_RDWR, DENY_NONE, A_0},
1287 : {0, O_WRONLY, DENY_READ, O_RDONLY, DENY_NONE, A_0},
1288 : {0, O_WRONLY, DENY_READ, O_WRONLY, DENY_NONE, A_W},
1289 : {0, O_WRONLY, DENY_READ, O_RDWR, DENY_FCB, A_0},
1290 : {0, O_WRONLY, DENY_READ, O_RDONLY, DENY_FCB, A_0},
1291 : {0, O_WRONLY, DENY_READ, O_WRONLY, DENY_FCB, A_0},
1292 : {0, O_RDWR, DENY_NONE, O_RDWR, DENY_DOS, A_0},
1293 : {0, O_RDWR, DENY_NONE, O_RDONLY, DENY_DOS, A_0},
1294 : {0, O_RDWR, DENY_NONE, O_WRONLY, DENY_DOS, A_0},
1295 : {0, O_RDWR, DENY_NONE, O_RDWR, DENY_ALL, A_0},
1296 : {0, O_RDWR, DENY_NONE, O_RDONLY, DENY_ALL, A_0},
1297 : {0, O_RDWR, DENY_NONE, O_WRONLY, DENY_ALL, A_0},
1298 : {0, O_RDWR, DENY_NONE, O_RDWR, DENY_WRITE, A_0},
1299 : {0, O_RDWR, DENY_NONE, O_RDONLY, DENY_WRITE, A_0},
1300 : {0, O_RDWR, DENY_NONE, O_WRONLY, DENY_WRITE, A_0},
1301 : {0, O_RDWR, DENY_NONE, O_RDWR, DENY_READ, A_0},
1302 : {0, O_RDWR, DENY_NONE, O_RDONLY, DENY_READ, A_0},
1303 : {0, O_RDWR, DENY_NONE, O_WRONLY, DENY_READ, A_0},
1304 : {0, O_RDWR, DENY_NONE, O_RDWR, DENY_NONE, A_RW},
1305 : {0, O_RDWR, DENY_NONE, O_RDONLY, DENY_NONE, A_R},
1306 : {0, O_RDWR, DENY_NONE, O_WRONLY, DENY_NONE, A_W},
1307 : {0, O_RDWR, DENY_NONE, O_RDWR, DENY_FCB, A_0},
1308 : {0, O_RDWR, DENY_NONE, O_RDONLY, DENY_FCB, A_0},
1309 : {0, O_RDWR, DENY_NONE, O_WRONLY, DENY_FCB, A_0},
1310 : {0, O_RDONLY, DENY_NONE, O_RDWR, DENY_DOS, A_0},
1311 : {0, O_RDONLY, DENY_NONE, O_RDONLY, DENY_DOS, A_R},
1312 : {0, O_RDONLY, DENY_NONE, O_WRONLY, DENY_DOS, A_0},
1313 : {0, O_RDONLY, DENY_NONE, O_RDWR, DENY_ALL, A_0},
1314 : {0, O_RDONLY, DENY_NONE, O_RDONLY, DENY_ALL, A_0},
1315 : {0, O_RDONLY, DENY_NONE, O_WRONLY, DENY_ALL, A_0},
1316 : {0, O_RDONLY, DENY_NONE, O_RDWR, DENY_WRITE, A_RW},
1317 : {0, O_RDONLY, DENY_NONE, O_RDONLY, DENY_WRITE, A_R},
1318 : {0, O_RDONLY, DENY_NONE, O_WRONLY, DENY_WRITE, A_W},
1319 : {0, O_RDONLY, DENY_NONE, O_RDWR, DENY_READ, A_0},
1320 : {0, O_RDONLY, DENY_NONE, O_RDONLY, DENY_READ, A_0},
1321 : {0, O_RDONLY, DENY_NONE, O_WRONLY, DENY_READ, A_0},
1322 : {0, O_RDONLY, DENY_NONE, O_RDWR, DENY_NONE, A_RW},
1323 : {0, O_RDONLY, DENY_NONE, O_RDONLY, DENY_NONE, A_R},
1324 : {0, O_RDONLY, DENY_NONE, O_WRONLY, DENY_NONE, A_W},
1325 : {0, O_RDONLY, DENY_NONE, O_RDWR, DENY_FCB, A_0},
1326 : {0, O_RDONLY, DENY_NONE, O_RDONLY, DENY_FCB, A_0},
1327 : {0, O_RDONLY, DENY_NONE, O_WRONLY, DENY_FCB, A_0},
1328 : {0, O_WRONLY, DENY_NONE, O_RDWR, DENY_DOS, A_0},
1329 : {0, O_WRONLY, DENY_NONE, O_RDONLY, DENY_DOS, A_0},
1330 : {0, O_WRONLY, DENY_NONE, O_WRONLY, DENY_DOS, A_0},
1331 : {0, O_WRONLY, DENY_NONE, O_RDWR, DENY_ALL, A_0},
1332 : {0, O_WRONLY, DENY_NONE, O_RDONLY, DENY_ALL, A_0},
1333 : {0, O_WRONLY, DENY_NONE, O_WRONLY, DENY_ALL, A_0},
1334 : {0, O_WRONLY, DENY_NONE, O_RDWR, DENY_WRITE, A_0},
1335 : {0, O_WRONLY, DENY_NONE, O_RDONLY, DENY_WRITE, A_0},
1336 : {0, O_WRONLY, DENY_NONE, O_WRONLY, DENY_WRITE, A_0},
1337 : {0, O_WRONLY, DENY_NONE, O_RDWR, DENY_READ, A_RW},
1338 : {0, O_WRONLY, DENY_NONE, O_RDONLY, DENY_READ, A_R},
1339 : {0, O_WRONLY, DENY_NONE, O_WRONLY, DENY_READ, A_W},
1340 : {0, O_WRONLY, DENY_NONE, O_RDWR, DENY_NONE, A_RW},
1341 : {0, O_WRONLY, DENY_NONE, O_RDONLY, DENY_NONE, A_R},
1342 : {0, O_WRONLY, DENY_NONE, O_WRONLY, DENY_NONE, A_W},
1343 : {0, O_WRONLY, DENY_NONE, O_RDWR, DENY_FCB, A_0},
1344 : {0, O_WRONLY, DENY_NONE, O_RDONLY, DENY_FCB, A_0},
1345 : {0, O_WRONLY, DENY_NONE, O_WRONLY, DENY_FCB, A_0},
1346 : {0, O_RDWR, DENY_FCB, O_RDWR, DENY_DOS, A_RW},
1347 : {0, O_RDWR, DENY_FCB, O_RDONLY, DENY_DOS, A_R},
1348 : {0, O_RDWR, DENY_FCB, O_WRONLY, DENY_DOS, A_W},
1349 : {0, O_RDWR, DENY_FCB, O_RDWR, DENY_ALL, A_0},
1350 : {0, O_RDWR, DENY_FCB, O_RDONLY, DENY_ALL, A_0},
1351 : {0, O_RDWR, DENY_FCB, O_WRONLY, DENY_ALL, A_0},
1352 : {0, O_RDWR, DENY_FCB, O_RDWR, DENY_WRITE, A_0},
1353 : {0, O_RDWR, DENY_FCB, O_RDONLY, DENY_WRITE, A_0},
1354 : {0, O_RDWR, DENY_FCB, O_WRONLY, DENY_WRITE, A_0},
1355 : {0, O_RDWR, DENY_FCB, O_RDWR, DENY_READ, A_0},
1356 : {0, O_RDWR, DENY_FCB, O_RDONLY, DENY_READ, A_0},
1357 : {0, O_RDWR, DENY_FCB, O_WRONLY, DENY_READ, A_0},
1358 : {0, O_RDWR, DENY_FCB, O_RDWR, DENY_NONE, A_0},
1359 : {0, O_RDWR, DENY_FCB, O_RDONLY, DENY_NONE, A_0},
1360 : {0, O_RDWR, DENY_FCB, O_WRONLY, DENY_NONE, A_0},
1361 : {0, O_RDWR, DENY_FCB, O_RDWR, DENY_FCB, A_RW},
1362 : {0, O_RDWR, DENY_FCB, O_RDONLY, DENY_FCB, A_RW},
1363 : {0, O_RDWR, DENY_FCB, O_WRONLY, DENY_FCB, A_RW},
1364 : {0, O_RDONLY, DENY_FCB, O_RDWR, DENY_DOS, A_RW},
1365 : {0, O_RDONLY, DENY_FCB, O_RDONLY, DENY_DOS, A_R},
1366 : {0, O_RDONLY, DENY_FCB, O_WRONLY, DENY_DOS, A_W},
1367 : {0, O_RDONLY, DENY_FCB, O_RDWR, DENY_ALL, A_0},
1368 : {0, O_RDONLY, DENY_FCB, O_RDONLY, DENY_ALL, A_0},
1369 : {0, O_RDONLY, DENY_FCB, O_WRONLY, DENY_ALL, A_0},
1370 : {0, O_RDONLY, DENY_FCB, O_RDWR, DENY_WRITE, A_0},
1371 : {0, O_RDONLY, DENY_FCB, O_RDONLY, DENY_WRITE, A_0},
1372 : {0, O_RDONLY, DENY_FCB, O_WRONLY, DENY_WRITE, A_0},
1373 : {0, O_RDONLY, DENY_FCB, O_RDWR, DENY_READ, A_0},
1374 : {0, O_RDONLY, DENY_FCB, O_RDONLY, DENY_READ, A_0},
1375 : {0, O_RDONLY, DENY_FCB, O_WRONLY, DENY_READ, A_0},
1376 : {0, O_RDONLY, DENY_FCB, O_RDWR, DENY_NONE, A_0},
1377 : {0, O_RDONLY, DENY_FCB, O_RDONLY, DENY_NONE, A_0},
1378 : {0, O_RDONLY, DENY_FCB, O_WRONLY, DENY_NONE, A_0},
1379 : {0, O_RDONLY, DENY_FCB, O_RDWR, DENY_FCB, A_RW},
1380 : {0, O_RDONLY, DENY_FCB, O_RDONLY, DENY_FCB, A_RW},
1381 : {0, O_RDONLY, DENY_FCB, O_WRONLY, DENY_FCB, A_RW},
1382 : {0, O_WRONLY, DENY_FCB, O_RDWR, DENY_DOS, A_RW},
1383 : {0, O_WRONLY, DENY_FCB, O_RDONLY, DENY_DOS, A_R},
1384 : {0, O_WRONLY, DENY_FCB, O_WRONLY, DENY_DOS, A_W},
1385 : {0, O_WRONLY, DENY_FCB, O_RDWR, DENY_ALL, A_0},
1386 : {0, O_WRONLY, DENY_FCB, O_RDONLY, DENY_ALL, A_0},
1387 : {0, O_WRONLY, DENY_FCB, O_WRONLY, DENY_ALL, A_0},
1388 : {0, O_WRONLY, DENY_FCB, O_RDWR, DENY_WRITE, A_0},
1389 : {0, O_WRONLY, DENY_FCB, O_RDONLY, DENY_WRITE, A_0},
1390 : {0, O_WRONLY, DENY_FCB, O_WRONLY, DENY_WRITE, A_0},
1391 : {0, O_WRONLY, DENY_FCB, O_RDWR, DENY_READ, A_0},
1392 : {0, O_WRONLY, DENY_FCB, O_RDONLY, DENY_READ, A_0},
1393 : {0, O_WRONLY, DENY_FCB, O_WRONLY, DENY_READ, A_0},
1394 : {0, O_WRONLY, DENY_FCB, O_RDWR, DENY_NONE, A_0},
1395 : {0, O_WRONLY, DENY_FCB, O_RDONLY, DENY_NONE, A_0},
1396 : {0, O_WRONLY, DENY_FCB, O_WRONLY, DENY_NONE, A_0},
1397 : {0, O_WRONLY, DENY_FCB, O_RDWR, DENY_FCB, A_RW},
1398 : {0, O_WRONLY, DENY_FCB, O_RDONLY, DENY_FCB, A_RW},
1399 : {0, O_WRONLY, DENY_FCB, O_WRONLY, DENY_FCB, A_RW}
1400 : };
1401 :
1402 :
1403 5244 : static void progress_bar(struct torture_context *tctx, unsigned int i, unsigned int total)
1404 : {
1405 5244 : if (torture_setting_bool(tctx, "progress", true)) {
1406 0 : torture_comment(tctx, "%5d/%5d\r", i, total);
1407 0 : fflush(stdout);
1408 : }
1409 5244 : }
1410 :
1411 : /*
1412 : this produces a matrix of deny mode behaviour for 1 connection
1413 : */
1414 4 : bool torture_denytest1(struct torture_context *tctx,
1415 : struct smbcli_state *cli1)
1416 : {
1417 0 : int fnum1, fnum2;
1418 0 : int i;
1419 4 : bool correct = true;
1420 0 : struct timespec tv, tv_start;
1421 4 : const char *fnames[2] = {"\\denytest1.dat", "\\denytest1.exe"};
1422 4 : int failures=0;
1423 :
1424 4 : torture_comment(tctx, "Testing deny modes with 1 connection\n");
1425 :
1426 12 : for (i=0;i<2;i++) {
1427 8 : smbcli_unlink(cli1->tree, fnames[i]);
1428 8 : fnum1 = smbcli_open(cli1->tree, fnames[i], O_RDWR|O_CREAT, DENY_NONE);
1429 8 : smbcli_write(cli1->tree, fnum1, 0, fnames[i], 0, strlen(fnames[i]));
1430 8 : smbcli_close(cli1->tree, fnum1);
1431 : }
1432 :
1433 4 : torture_comment(tctx, "Testing %d entries\n", (int)ARRAY_SIZE(denytable1));
1434 :
1435 4 : clock_gettime_mono(&tv_start);
1436 :
1437 2596 : for (i=0; i<ARRAY_SIZE(denytable1); i++) {
1438 0 : enum deny_result res;
1439 2592 : const char *fname = fnames[denytable1[i].isexe];
1440 :
1441 2592 : progress_bar(tctx, i, ARRAY_SIZE(denytable1));
1442 :
1443 2592 : if (!torture_setting_bool(tctx, "deny_fcb_support", true) &&
1444 0 : (denytable1[i].deny1 == DENY_FCB ||
1445 0 : denytable1[i].deny2 == DENY_FCB))
1446 0 : continue;
1447 :
1448 2592 : if (!torture_setting_bool(tctx, "deny_dos_support", true) &&
1449 0 : (denytable1[i].deny1 == DENY_DOS ||
1450 0 : denytable1[i].deny2 == DENY_DOS))
1451 0 : continue;
1452 :
1453 2592 : fnum1 = smbcli_open(cli1->tree, fname,
1454 2592 : denytable1[i].mode1,
1455 2592 : denytable1[i].deny1);
1456 2592 : fnum2 = smbcli_open(cli1->tree, fname,
1457 2592 : denytable1[i].mode2,
1458 2592 : denytable1[i].deny2);
1459 :
1460 2592 : if (fnum1 == -1) {
1461 0 : res = A_X;
1462 2592 : } else if (fnum2 == -1) {
1463 2024 : res = A_0;
1464 : } else {
1465 568 : uint8_t x = 1;
1466 568 : res = A_0;
1467 568 : if (smbcli_read(cli1->tree, fnum2, &x, 0, 1) == 1) {
1468 400 : res += A_R;
1469 : }
1470 568 : if (smbcli_write(cli1->tree, fnum2, 0, &x, 0, 1) == 1) {
1471 380 : res += A_W;
1472 : }
1473 : }
1474 :
1475 2592 : if (torture_setting_bool(tctx, "showall", false) ||
1476 2592 : res != denytable1[i].result) {
1477 0 : int64_t tdif;
1478 0 : clock_gettime_mono(&tv);
1479 0 : tdif = nsec_time_diff(&tv, &tv_start);
1480 0 : tdif /= 1000000;
1481 0 : torture_comment(tctx, "%lld: %s %8s %10s %8s %10s %s (correct=%s)\n",
1482 : (long long)tdif,
1483 : fname,
1484 0 : denystr(denytable1[i].deny1),
1485 0 : openstr(denytable1[i].mode1),
1486 0 : denystr(denytable1[i].deny2),
1487 0 : openstr(denytable1[i].mode2),
1488 : resultstr(res),
1489 0 : resultstr(denytable1[i].result));
1490 : }
1491 :
1492 2592 : if (res != denytable1[i].result) {
1493 0 : correct = false;
1494 0 : CHECK_MAX_FAILURES(failed);
1495 : }
1496 :
1497 2592 : smbcli_close(cli1->tree, fnum1);
1498 2592 : smbcli_close(cli1->tree, fnum2);
1499 : }
1500 :
1501 4 : failed:
1502 12 : for (i=0;i<2;i++) {
1503 8 : smbcli_unlink(cli1->tree, fnames[i]);
1504 : }
1505 :
1506 4 : torture_comment(tctx, "finished denytest1 (%d failures)\n", failures);
1507 4 : return correct;
1508 : }
1509 :
1510 :
1511 : /*
1512 : this produces a matrix of deny mode behaviour with 2 connections
1513 : */
1514 4 : bool torture_denytest2(struct torture_context *tctx,
1515 : struct smbcli_state *cli1,
1516 : struct smbcli_state *cli2)
1517 : {
1518 0 : int fnum1, fnum2;
1519 0 : int i;
1520 4 : bool correct = true;
1521 4 : const char *fnames[2] = {"\\denytest2.dat", "\\denytest2.exe"};
1522 0 : struct timespec tv, tv_start;
1523 4 : int failures=0;
1524 :
1525 12 : for (i=0;i<2;i++) {
1526 8 : smbcli_unlink(cli1->tree, fnames[i]);
1527 8 : fnum1 = smbcli_open(cli1->tree, fnames[i], O_RDWR|O_CREAT, DENY_NONE);
1528 8 : smbcli_write(cli1->tree, fnum1, 0, fnames[i], 0, strlen(fnames[i]));
1529 8 : smbcli_close(cli1->tree, fnum1);
1530 : }
1531 :
1532 4 : clock_gettime_mono(&tv_start);
1533 :
1534 2596 : for (i=0; i<ARRAY_SIZE(denytable2); i++) {
1535 0 : enum deny_result res;
1536 2592 : const char *fname = fnames[denytable2[i].isexe];
1537 :
1538 2592 : progress_bar(tctx, i, ARRAY_SIZE(denytable1));
1539 :
1540 2592 : if (!torture_setting_bool(tctx, "deny_fcb_support", true) &&
1541 0 : (denytable1[i].deny1 == DENY_FCB ||
1542 0 : denytable1[i].deny2 == DENY_FCB))
1543 0 : continue;
1544 :
1545 2592 : if (!torture_setting_bool(tctx, "deny_dos_support", true) &&
1546 0 : (denytable1[i].deny1 == DENY_DOS ||
1547 0 : denytable1[i].deny2 == DENY_DOS))
1548 0 : continue;
1549 :
1550 2592 : fnum1 = smbcli_open(cli1->tree, fname,
1551 2592 : denytable2[i].mode1,
1552 2592 : denytable2[i].deny1);
1553 2592 : fnum2 = smbcli_open(cli2->tree, fname,
1554 2592 : denytable2[i].mode2,
1555 2592 : denytable2[i].deny2);
1556 :
1557 2592 : if (fnum1 == -1) {
1558 0 : res = A_X;
1559 2592 : } else if (fnum2 == -1) {
1560 2216 : res = A_0;
1561 : } else {
1562 376 : uint8_t x = 1;
1563 376 : res = A_0;
1564 376 : if (smbcli_read(cli2->tree, fnum2, &x, 0, 1) == 1) {
1565 240 : res += A_R;
1566 : }
1567 376 : if (smbcli_write(cli2->tree, fnum2, 0, &x, 0, 1) == 1) {
1568 220 : res += A_W;
1569 : }
1570 : }
1571 :
1572 2592 : if (torture_setting_bool(tctx, "showall", false) ||
1573 2592 : res != denytable2[i].result) {
1574 0 : int64_t tdif;
1575 0 : clock_gettime_mono(&tv);
1576 0 : tdif = nsec_time_diff(&tv, &tv_start);
1577 0 : tdif /= 1000000;
1578 0 : torture_comment(tctx, "%lld: %s %8s %10s %8s %10s %s (correct=%s)\n",
1579 : (long long)tdif,
1580 : fname,
1581 0 : denystr(denytable2[i].deny1),
1582 0 : openstr(denytable2[i].mode1),
1583 0 : denystr(denytable2[i].deny2),
1584 0 : openstr(denytable2[i].mode2),
1585 : resultstr(res),
1586 0 : resultstr(denytable2[i].result));
1587 : }
1588 :
1589 2592 : if (res != denytable2[i].result) {
1590 0 : correct = false;
1591 0 : CHECK_MAX_FAILURES(failed);
1592 : }
1593 :
1594 2592 : smbcli_close(cli1->tree, fnum1);
1595 2592 : smbcli_close(cli2->tree, fnum2);
1596 : }
1597 :
1598 4 : failed:
1599 12 : for (i=0;i<2;i++) {
1600 8 : smbcli_unlink(cli1->tree, fnames[i]);
1601 : }
1602 :
1603 4 : torture_comment(tctx, "finished denytest2 (%d failures)\n", failures);
1604 4 : return correct;
1605 : }
1606 :
1607 :
1608 :
1609 : /*
1610 : simple test harness for playing with deny modes
1611 : */
1612 6 : bool torture_denytest3(struct torture_context *tctx,
1613 : struct smbcli_state *cli1,
1614 : struct smbcli_state *cli2)
1615 : {
1616 0 : int fnum1, fnum2;
1617 0 : const char *fname;
1618 :
1619 6 : fname = "\\deny_dos1.dat";
1620 :
1621 6 : smbcli_unlink(cli1->tree, fname);
1622 6 : fnum1 = smbcli_open(cli1->tree, fname, O_CREAT|O_TRUNC|O_WRONLY, DENY_DOS);
1623 6 : fnum2 = smbcli_open(cli1->tree, fname, O_CREAT|O_TRUNC|O_WRONLY, DENY_DOS);
1624 6 : if (fnum1 != -1) smbcli_close(cli1->tree, fnum1);
1625 6 : if (fnum2 != -1) smbcli_close(cli1->tree, fnum2);
1626 6 : smbcli_unlink(cli1->tree, fname);
1627 6 : torture_comment(tctx, "fnum1=%d fnum2=%d\n", fnum1, fnum2);
1628 :
1629 :
1630 6 : fname = "\\deny_dos2.dat";
1631 :
1632 6 : smbcli_unlink(cli1->tree, fname);
1633 6 : fnum1 = smbcli_open(cli1->tree, fname, O_CREAT|O_TRUNC|O_WRONLY, DENY_DOS);
1634 6 : fnum2 = smbcli_open(cli2->tree, fname, O_CREAT|O_TRUNC|O_WRONLY, DENY_DOS);
1635 6 : if (fnum1 != -1) smbcli_close(cli1->tree, fnum1);
1636 6 : if (fnum2 != -1) smbcli_close(cli2->tree, fnum2);
1637 6 : smbcli_unlink(cli1->tree, fname);
1638 6 : torture_comment(tctx, "fnum1=%d fnum2=%d\n", fnum1, fnum2);
1639 :
1640 6 : return true;
1641 : }
1642 :
1643 : struct bit_value {
1644 : uint32_t value;
1645 : const char *name;
1646 : };
1647 :
1648 240 : static uint32_t map_bits(const struct bit_value *bv, int b, int nbits)
1649 : {
1650 0 : int i;
1651 240 : uint32_t ret = 0;
1652 1560 : for (i=0;i<nbits;i++) {
1653 1320 : if (b & (1<<i)) {
1654 671 : ret |= bv[i].value;
1655 : }
1656 : }
1657 240 : return ret;
1658 : }
1659 :
1660 0 : static const char *bit_string(TALLOC_CTX *mem_ctx, const struct bit_value *bv, int b, int nbits)
1661 : {
1662 0 : char *ret = NULL;
1663 0 : int i;
1664 0 : for (i=0;i<nbits;i++) {
1665 0 : if (b & (1<<i)) {
1666 0 : if (ret == NULL) {
1667 0 : ret = talloc_asprintf(mem_ctx, "%s", bv[i].name);
1668 : } else {
1669 0 : ret = talloc_asprintf_append_buffer(ret, " | %s", bv[i].name);
1670 : }
1671 : }
1672 : }
1673 0 : if (ret == NULL) ret = talloc_strdup(mem_ctx, "(NONE)");
1674 0 : return ret;
1675 : }
1676 :
1677 :
1678 : /*
1679 : determine if two opens conflict
1680 : */
1681 60 : static NTSTATUS predict_share_conflict(uint32_t sa1, uint32_t am1, uint32_t sa2, uint32_t am2,
1682 : bool read_for_execute, enum deny_result *res)
1683 : {
1684 : #define CHECK_MASK(am, sa, right, share) do { \
1685 : if (((am) & (right)) && !((sa) & (share))) { \
1686 : *res = A_0; \
1687 : return NT_STATUS_SHARING_VIOLATION; \
1688 : }} while (0)
1689 :
1690 60 : *res = A_0;
1691 60 : if (am2 & (SEC_FILE_WRITE_DATA | SEC_FILE_APPEND_DATA)) {
1692 40 : *res += A_W;
1693 : }
1694 60 : if (am2 & SEC_FILE_READ_DATA) {
1695 32 : *res += A_R;
1696 28 : } else if ((am2 & SEC_FILE_EXECUTE) && read_for_execute) {
1697 13 : *res += A_R;
1698 : }
1699 :
1700 : /* if either open involves no read.write or delete access then
1701 : it can't conflict */
1702 60 : if (!(am1 & (SEC_FILE_WRITE_DATA |
1703 : SEC_FILE_APPEND_DATA |
1704 : SEC_FILE_READ_DATA |
1705 : SEC_FILE_EXECUTE |
1706 : SEC_STD_DELETE))) {
1707 1 : return NT_STATUS_OK;
1708 : }
1709 59 : if (!(am2 & (SEC_FILE_WRITE_DATA |
1710 : SEC_FILE_APPEND_DATA |
1711 : SEC_FILE_READ_DATA |
1712 : SEC_FILE_EXECUTE |
1713 : SEC_STD_DELETE))) {
1714 5 : return NT_STATUS_OK;
1715 : }
1716 :
1717 : /* check the basic share access */
1718 54 : CHECK_MASK(am1, sa2,
1719 : SEC_FILE_WRITE_DATA | SEC_FILE_APPEND_DATA,
1720 : NTCREATEX_SHARE_ACCESS_WRITE);
1721 26 : CHECK_MASK(am2, sa1,
1722 : SEC_FILE_WRITE_DATA | SEC_FILE_APPEND_DATA,
1723 : NTCREATEX_SHARE_ACCESS_WRITE);
1724 :
1725 16 : CHECK_MASK(am1, sa2,
1726 : SEC_FILE_READ_DATA | SEC_FILE_EXECUTE,
1727 : NTCREATEX_SHARE_ACCESS_READ);
1728 12 : CHECK_MASK(am2, sa1,
1729 : SEC_FILE_READ_DATA | SEC_FILE_EXECUTE,
1730 : NTCREATEX_SHARE_ACCESS_READ);
1731 :
1732 7 : CHECK_MASK(am1, sa2,
1733 : SEC_STD_DELETE,
1734 : NTCREATEX_SHARE_ACCESS_DELETE);
1735 7 : CHECK_MASK(am2, sa1,
1736 : SEC_STD_DELETE,
1737 : NTCREATEX_SHARE_ACCESS_DELETE);
1738 :
1739 7 : return NT_STATUS_OK;
1740 : }
1741 :
1742 : /*
1743 : a denytest for ntcreatex
1744 : */
1745 6 : static bool torture_ntdenytest(struct torture_context *tctx,
1746 : struct smbcli_state *cli1,
1747 : struct smbcli_state *cli2, int client)
1748 : {
1749 6 : const struct bit_value share_access_bits[] = {
1750 : { NTCREATEX_SHARE_ACCESS_READ, "S_R" },
1751 : { NTCREATEX_SHARE_ACCESS_WRITE, "S_W" },
1752 : { NTCREATEX_SHARE_ACCESS_DELETE, "S_D" }
1753 : };
1754 6 : const struct bit_value access_mask_bits[] = {
1755 : { SEC_FILE_READ_DATA, "R_DATA" },
1756 : { SEC_FILE_WRITE_DATA, "W_DATA" },
1757 : { SEC_FILE_READ_ATTRIBUTE, "R_ATTR" },
1758 : { SEC_FILE_WRITE_ATTRIBUTE, "W_ATTR" },
1759 : { SEC_FILE_READ_EA, "R_EAS " },
1760 : { SEC_FILE_WRITE_EA, "W_EAS " },
1761 : { SEC_FILE_APPEND_DATA, "A_DATA" },
1762 : { SEC_FILE_EXECUTE, "EXEC " }
1763 : };
1764 0 : int fnum1;
1765 0 : int i;
1766 6 : bool correct = true;
1767 0 : struct timespec tv, tv_start;
1768 0 : const char *fname;
1769 6 : int nbits1 = ARRAY_SIZE(share_access_bits);
1770 6 : int nbits2 = ARRAY_SIZE(access_mask_bits);
1771 0 : union smb_open io1, io2;
1772 0 : extern int torture_numops;
1773 6 : int failures = 0;
1774 0 : uint8_t buf[1];
1775 :
1776 6 : torture_comment(tctx, "format: server correct\n");
1777 :
1778 6 : ZERO_STRUCT(buf);
1779 :
1780 6 : fname = talloc_asprintf(cli1, "\\ntdeny_%d.dll", client);
1781 :
1782 6 : smbcli_unlink(cli1->tree, fname);
1783 6 : fnum1 = smbcli_open(cli1->tree, fname, O_RDWR|O_CREAT, DENY_NONE);
1784 6 : smbcli_write(cli1->tree, fnum1, 0, buf, 0, sizeof(buf));
1785 6 : smbcli_close(cli1->tree, fnum1);
1786 :
1787 6 : clock_gettime_mono(&tv_start);
1788 :
1789 6 : io1.ntcreatex.level = RAW_OPEN_NTCREATEX;
1790 6 : io1.ntcreatex.in.root_fid.fnum = 0;
1791 6 : io1.ntcreatex.in.flags = NTCREATEX_FLAGS_EXTENDED;
1792 6 : io1.ntcreatex.in.create_options = NTCREATEX_OPTIONS_NON_DIRECTORY_FILE;
1793 6 : io1.ntcreatex.in.file_attr = 0;
1794 6 : io1.ntcreatex.in.alloc_size = 0;
1795 6 : io1.ntcreatex.in.open_disposition = NTCREATEX_DISP_OPEN;
1796 6 : io1.ntcreatex.in.impersonation = NTCREATEX_IMPERSONATION_IMPERSONATION;
1797 6 : io1.ntcreatex.in.security_flags = 0;
1798 6 : io1.ntcreatex.in.fname = fname;
1799 6 : io2 = io1;
1800 :
1801 6 : torture_comment(tctx, "Testing %d entries on %s\n", torture_numops, fname);
1802 :
1803 66 : for (i=0;i<torture_numops;i++) {
1804 0 : NTSTATUS status1, status2, status2_p;
1805 60 : TALLOC_CTX *mem_ctx = talloc_new(NULL);
1806 0 : enum deny_result res, res2;
1807 60 : int b_sa1 = random() & ((1<<nbits1)-1);
1808 60 : int b_am1 = random() & ((1<<nbits2)-1);
1809 60 : int b_sa2 = random() & ((1<<nbits1)-1);
1810 60 : int b_am2 = random() & ((1<<nbits2)-1);
1811 0 : bool read_for_execute;
1812 :
1813 60 : progress_bar(tctx, i, torture_numops);
1814 :
1815 60 : io1.ntcreatex.in.share_access = map_bits(share_access_bits, b_sa1, nbits1);
1816 60 : io1.ntcreatex.in.access_mask = map_bits(access_mask_bits, b_am1, nbits2);
1817 :
1818 60 : io2.ntcreatex.in.share_access = map_bits(share_access_bits, b_sa2, nbits1);
1819 60 : io2.ntcreatex.in.access_mask = map_bits(access_mask_bits, b_am2, nbits2);
1820 :
1821 60 : status1 = smb_raw_open(cli1->tree, mem_ctx, &io1);
1822 60 : status2 = smb_raw_open(cli2->tree, mem_ctx, &io2);
1823 :
1824 60 : if (random() % 2 == 0) {
1825 26 : read_for_execute = true;
1826 : } else {
1827 34 : read_for_execute = false;
1828 : }
1829 :
1830 60 : if (!NT_STATUS_IS_OK(status1)) {
1831 0 : res = A_X;
1832 60 : } else if (!NT_STATUS_IS_OK(status2)) {
1833 47 : res = A_0;
1834 : } else {
1835 0 : union smb_read r;
1836 0 : NTSTATUS status;
1837 :
1838 : /* we can't use smbcli_read() as we need to
1839 : set read_for_execute */
1840 13 : r.readx.level = RAW_READ_READX;
1841 13 : r.readx.in.file.fnum = io2.ntcreatex.out.file.fnum;
1842 13 : r.readx.in.offset = 0;
1843 13 : r.readx.in.mincnt = sizeof(buf);
1844 13 : r.readx.in.maxcnt = sizeof(buf);
1845 13 : r.readx.in.remaining = 0;
1846 13 : r.readx.in.read_for_execute = read_for_execute;
1847 13 : r.readx.out.data = buf;
1848 :
1849 13 : res = A_0;
1850 13 : status = smb_raw_read(cli2->tree, &r);
1851 13 : if (NT_STATUS_IS_OK(status)) {
1852 6 : res += A_R;
1853 : }
1854 13 : if (smbcli_write(cli2->tree, io2.ntcreatex.out.file.fnum,
1855 : 0, buf, 0, sizeof(buf)) >= 1) {
1856 4 : res += A_W;
1857 : }
1858 : }
1859 :
1860 60 : if (NT_STATUS_IS_OK(status1)) {
1861 60 : smbcli_close(cli1->tree, io1.ntcreatex.out.file.fnum);
1862 : }
1863 60 : if (NT_STATUS_IS_OK(status2)) {
1864 13 : smbcli_close(cli2->tree, io2.ntcreatex.out.file.fnum);
1865 : }
1866 :
1867 60 : status2_p = predict_share_conflict(io1.ntcreatex.in.share_access,
1868 : io1.ntcreatex.in.access_mask,
1869 : io2.ntcreatex.in.share_access,
1870 : io2.ntcreatex.in.access_mask,
1871 : read_for_execute,
1872 : &res2);
1873 :
1874 60 : clock_gettime_mono(&tv);
1875 60 : if (torture_setting_bool(tctx, "showall", false) ||
1876 60 : !NT_STATUS_EQUAL(status2, status2_p) ||
1877 60 : res != res2) {
1878 0 : torture_comment(tctx, "\n%-20s %-70s\n%-20s %-70s %4s %4s %s/%s\n",
1879 : bit_string(mem_ctx, share_access_bits, b_sa1, nbits1),
1880 : bit_string(mem_ctx, access_mask_bits, b_am1, nbits2),
1881 : bit_string(mem_ctx, share_access_bits, b_sa2, nbits1),
1882 : bit_string(mem_ctx, access_mask_bits, b_am2, nbits2),
1883 : resultstr(res),
1884 : resultstr(res2),
1885 : nt_errstr(status2),
1886 : nt_errstr(status2_p));
1887 0 : fflush(stdout);
1888 : }
1889 :
1890 60 : if (res != res2 ||
1891 60 : !NT_STATUS_EQUAL(status2, status2_p)) {
1892 0 : CHECK_MAX_FAILURES(failed);
1893 0 : correct = false;
1894 : }
1895 :
1896 60 : talloc_free(mem_ctx);
1897 : }
1898 :
1899 6 : failed:
1900 6 : smbcli_unlink(cli1->tree, fname);
1901 :
1902 6 : torture_comment(tctx, "finished ntdenytest (%d failures)\n", failures);
1903 6 : return correct;
1904 : }
1905 :
1906 :
1907 :
1908 : /*
1909 : a denytest for ntcreatex
1910 : */
1911 0 : bool torture_ntdenytest1(struct torture_context *tctx,
1912 : struct smbcli_state *cli, int client)
1913 : {
1914 0 : extern int torture_seed;
1915 :
1916 0 : srandom(torture_seed + client);
1917 :
1918 0 : torture_comment(tctx, "starting ntdenytest1 client %d\n", client);
1919 :
1920 0 : return torture_ntdenytest(tctx, cli, cli, client);
1921 : }
1922 :
1923 : /*
1924 : a denytest for ntcreatex
1925 : */
1926 6 : bool torture_ntdenytest2(struct torture_context *torture,
1927 : struct smbcli_state *cli1,
1928 : struct smbcli_state *cli2)
1929 : {
1930 6 : return torture_ntdenytest(torture, cli1, cli2, 0);
1931 : }
1932 :
1933 : #define COMPARE_STATUS(status, correct) do { \
1934 : if (!NT_STATUS_EQUAL(status, correct)) { \
1935 : torture_result(tctx, TORTURE_FAIL, \
1936 : "(%s) Incorrect status %s - should be %s\n", \
1937 : __location__, nt_errstr(status), nt_errstr(correct)); \
1938 : ret = false; \
1939 : failed = true; \
1940 : }} while (0)
1941 :
1942 : #define CHECK_STATUS(status, correct) do { \
1943 : if (!NT_STATUS_EQUAL(status, correct)) { \
1944 : torture_result(tctx, TORTURE_FAIL, \
1945 : "(%s) Incorrect status %s - should be %s\n", \
1946 : __location__, nt_errstr(status), nt_errstr(correct)); \
1947 : ret = false; \
1948 : goto done; \
1949 : }} while (0)
1950 :
1951 : #define CHECK_VAL(v, correct) do { \
1952 : if ((v) != (correct)) { \
1953 : torture_result(tctx, TORTURE_FAIL, \
1954 : "(%s) wrong value for %s 0x%x - should be 0x%x\n", \
1955 : __location__, #v, (int)(v), (int)correct); \
1956 : ret = false; \
1957 : }} while (0)
1958 :
1959 : /*
1960 : test sharing of handles with DENY_DOS on a single connection
1961 : */
1962 6 : bool torture_denydos_sharing(struct torture_context *tctx,
1963 : struct smbcli_state *cli)
1964 : {
1965 0 : union smb_open io;
1966 0 : union smb_fileinfo finfo;
1967 6 : const char *fname = "\\torture_denydos.txt";
1968 0 : NTSTATUS status;
1969 6 : int fnum1 = -1, fnum2 = -1;
1970 6 : bool ret = true;
1971 0 : union smb_setfileinfo sfinfo;
1972 0 : TALLOC_CTX *mem_ctx;
1973 :
1974 6 : mem_ctx = talloc_new(cli);
1975 :
1976 6 : torture_comment(tctx, "Checking DENY_DOS shared handle semantics\n");
1977 6 : smbcli_unlink(cli->tree, fname);
1978 :
1979 6 : io.openx.level = RAW_OPEN_OPENX;
1980 6 : io.openx.in.fname = fname;
1981 6 : io.openx.in.flags = OPENX_FLAGS_ADDITIONAL_INFO;
1982 6 : io.openx.in.open_mode = OPENX_MODE_ACCESS_RDWR | OPENX_MODE_DENY_DOS;
1983 6 : io.openx.in.open_func = OPENX_OPEN_FUNC_OPEN | OPENX_OPEN_FUNC_CREATE;
1984 6 : io.openx.in.search_attrs = 0;
1985 6 : io.openx.in.file_attrs = 0;
1986 6 : io.openx.in.write_time = 0;
1987 6 : io.openx.in.size = 0;
1988 6 : io.openx.in.timeout = 0;
1989 :
1990 6 : torture_comment(tctx, "openx twice with RDWR/DENY_DOS\n");
1991 6 : status = smb_raw_open(cli->tree, mem_ctx, &io);
1992 6 : CHECK_STATUS(status, NT_STATUS_OK);
1993 6 : fnum1 = io.openx.out.file.fnum;
1994 :
1995 6 : status = smb_raw_open(cli->tree, mem_ctx, &io);
1996 6 : CHECK_STATUS(status, NT_STATUS_OK);
1997 6 : fnum2 = io.openx.out.file.fnum;
1998 :
1999 6 : torture_comment(tctx, "fnum1=%d fnum2=%d\n", fnum1, fnum2);
2000 :
2001 6 : sfinfo.generic.level = RAW_SFILEINFO_POSITION_INFORMATION;
2002 6 : sfinfo.position_information.in.file.fnum = fnum1;
2003 6 : sfinfo.position_information.in.position = 1000;
2004 6 : status = smb_raw_setfileinfo(cli->tree, &sfinfo);
2005 6 : CHECK_STATUS(status, NT_STATUS_OK);
2006 :
2007 6 : torture_comment(tctx, "two handles should be same file handle\n");
2008 6 : finfo.position_information.level = RAW_FILEINFO_POSITION_INFORMATION;
2009 6 : finfo.position_information.in.file.fnum = fnum1;
2010 6 : status = smb_raw_fileinfo(cli->tree, mem_ctx, &finfo);
2011 6 : CHECK_STATUS(status, NT_STATUS_OK);
2012 6 : CHECK_VAL(finfo.position_information.out.position, 1000);
2013 :
2014 6 : finfo.position_information.in.file.fnum = fnum2;
2015 6 : status = smb_raw_fileinfo(cli->tree, mem_ctx, &finfo);
2016 6 : CHECK_STATUS(status, NT_STATUS_OK);
2017 6 : CHECK_VAL(finfo.position_information.out.position, 1000);
2018 :
2019 :
2020 6 : smbcli_close(cli->tree, fnum1);
2021 6 : smbcli_close(cli->tree, fnum2);
2022 :
2023 6 : torture_comment(tctx, "openx twice with RDWR/DENY_NONE\n");
2024 6 : io.openx.in.open_mode = OPENX_MODE_ACCESS_RDWR | OPENX_MODE_DENY_NONE;
2025 6 : status = smb_raw_open(cli->tree, mem_ctx, &io);
2026 6 : CHECK_STATUS(status, NT_STATUS_OK);
2027 6 : fnum1 = io.openx.out.file.fnum;
2028 :
2029 6 : io.openx.in.open_func = OPENX_OPEN_FUNC_OPEN;
2030 6 : status = smb_raw_open(cli->tree, mem_ctx, &io);
2031 6 : CHECK_STATUS(status, NT_STATUS_OK);
2032 6 : fnum2 = io.openx.out.file.fnum;
2033 :
2034 6 : torture_comment(tctx, "fnum1=%d fnum2=%d\n", fnum1, fnum2);
2035 :
2036 6 : torture_comment(tctx, "two handles should be separate\n");
2037 6 : sfinfo.generic.level = RAW_SFILEINFO_POSITION_INFORMATION;
2038 6 : sfinfo.position_information.in.file.fnum = fnum1;
2039 6 : sfinfo.position_information.in.position = 1000;
2040 6 : status = smb_raw_setfileinfo(cli->tree, &sfinfo);
2041 6 : CHECK_STATUS(status, NT_STATUS_OK);
2042 :
2043 6 : finfo.position_information.level = RAW_FILEINFO_POSITION_INFORMATION;
2044 6 : finfo.position_information.in.file.fnum = fnum1;
2045 6 : status = smb_raw_fileinfo(cli->tree, mem_ctx, &finfo);
2046 6 : CHECK_STATUS(status, NT_STATUS_OK);
2047 6 : CHECK_VAL(finfo.position_information.out.position, 1000);
2048 :
2049 6 : finfo.position_information.in.file.fnum = fnum2;
2050 6 : status = smb_raw_fileinfo(cli->tree, mem_ctx, &finfo);
2051 6 : CHECK_STATUS(status, NT_STATUS_OK);
2052 6 : CHECK_VAL(finfo.position_information.out.position, 0);
2053 :
2054 6 : done:
2055 6 : smbcli_close(cli->tree, fnum1);
2056 6 : smbcli_close(cli->tree, fnum2);
2057 6 : smbcli_unlink(cli->tree, fname);
2058 :
2059 6 : return ret;
2060 : }
2061 :
2062 : #define CXD_MATCHES(_cxd, i) \
2063 : ((cxd_known[i].cxd_test == (_cxd)->cxd_test) && \
2064 : (cxd_known[i].cxd_flags == (_cxd)->cxd_flags) && \
2065 : (cxd_known[i].cxd_access1 == (_cxd)->cxd_access1) && \
2066 : (cxd_known[i].cxd_sharemode1 == (_cxd)->cxd_sharemode1) && \
2067 : (cxd_known[i].cxd_access2 == (_cxd)->cxd_access2) && \
2068 : (cxd_known[i].cxd_sharemode2 == (_cxd)->cxd_sharemode2))
2069 :
2070 13952 : static int cxd_find_known(struct createx_data *cxd)
2071 : {
2072 0 : static int i = -1;
2073 :
2074 : /* Optimization for tests which we don't have results saved for. */
2075 13952 : if ((cxd->cxd_test == CXD_TEST_CREATEX_ACCESS_EXHAUSTIVE) ||
2076 13952 : (cxd->cxd_test == CXD_TEST_CREATEX_SHAREMODE_EXTENDED))
2077 0 : return -1;
2078 :
2079 : /* Optimization: If our cxd_known table is too large, it hurts test
2080 : * performance to search through the entire table each time. If the
2081 : * caller can pass in the previous result, we can try the next entry.
2082 : * This works if results are taken directly from the same code. */
2083 13952 : i++;
2084 13952 : if ((i >= 0) && (i < sizeof(cxd_known) / sizeof(cxd_known[0])) &&
2085 13952 : CXD_MATCHES(cxd, i))
2086 13949 : return i;
2087 :
2088 5347 : for (i = 0; i < (sizeof(cxd_known) / sizeof(cxd_known[0])); i++) {
2089 5347 : if (CXD_MATCHES(cxd, i))
2090 3 : return i;
2091 : }
2092 :
2093 0 : return -1;
2094 : }
2095 :
2096 : #define CREATEX_NAME "\\createx_dir"
2097 :
2098 416 : static bool createx_make_dir(struct torture_context *tctx,
2099 : struct smbcli_tree *tree, TALLOC_CTX *mem_ctx, const char *fname)
2100 : {
2101 416 : bool ret = true;
2102 0 : NTSTATUS status;
2103 :
2104 416 : status = smbcli_mkdir(tree, fname);
2105 416 : CHECK_STATUS(status, NT_STATUS_OK);
2106 :
2107 416 : done:
2108 416 : return ret;
2109 : }
2110 :
2111 416 : static bool createx_make_file(struct torture_context *tctx,
2112 : struct smbcli_tree *tree, TALLOC_CTX *mem_ctx, const char *fname)
2113 : {
2114 0 : union smb_open open_parms;
2115 416 : bool ret = true;
2116 0 : NTSTATUS status;
2117 :
2118 416 : ZERO_STRUCT(open_parms);
2119 416 : open_parms.generic.level = RAW_OPEN_NTCREATEX;
2120 416 : open_parms.ntcreatex.in.flags = 0;
2121 416 : open_parms.ntcreatex.in.access_mask = SEC_RIGHTS_FILE_ALL;
2122 416 : open_parms.ntcreatex.in.file_attr = FILE_ATTRIBUTE_NORMAL;
2123 416 : open_parms.ntcreatex.in.share_access = 0;
2124 416 : open_parms.ntcreatex.in.open_disposition = NTCREATEX_DISP_CREATE;
2125 416 : open_parms.ntcreatex.in.create_options = 0;
2126 416 : open_parms.ntcreatex.in.fname = fname;
2127 :
2128 416 : status = smb_raw_open(tree, mem_ctx, &open_parms);
2129 416 : CHECK_STATUS(status, NT_STATUS_OK);
2130 :
2131 416 : status = smbcli_close(tree, open_parms.ntcreatex.out.file.fnum);
2132 416 : CHECK_STATUS(status, NT_STATUS_OK);
2133 :
2134 416 : done:
2135 416 : return ret;
2136 : }
2137 :
2138 9024 : static void createx_fill_dir(union smb_open *open_parms, int accessmode,
2139 : int sharemode, const char *fname)
2140 : {
2141 9024 : ZERO_STRUCTP(open_parms);
2142 9024 : open_parms->generic.level = RAW_OPEN_NTCREATEX;
2143 9024 : open_parms->ntcreatex.in.flags = 0;
2144 9024 : open_parms->ntcreatex.in.access_mask = accessmode;
2145 9024 : open_parms->ntcreatex.in.file_attr = FILE_ATTRIBUTE_DIRECTORY;
2146 9024 : open_parms->ntcreatex.in.share_access = sharemode;
2147 9024 : open_parms->ntcreatex.in.open_disposition = NTCREATEX_DISP_OPEN_IF;
2148 9024 : open_parms->ntcreatex.in.create_options = NTCREATEX_OPTIONS_DIRECTORY;
2149 9024 : open_parms->ntcreatex.in.fname = fname;
2150 9024 : }
2151 :
2152 17216 : static void createx_fill_file(union smb_open *open_parms, int accessmode,
2153 : int sharemode, const char *fname)
2154 : {
2155 17216 : ZERO_STRUCTP(open_parms);
2156 17216 : open_parms->generic.level = RAW_OPEN_NTCREATEX;
2157 17216 : open_parms->ntcreatex.in.flags = 0;
2158 17216 : open_parms->ntcreatex.in.access_mask = accessmode;
2159 17216 : open_parms->ntcreatex.in.file_attr = FILE_ATTRIBUTE_NORMAL;
2160 17216 : open_parms->ntcreatex.in.share_access = sharemode;
2161 17216 : open_parms->ntcreatex.in.open_disposition = NTCREATEX_DISP_OPEN_IF;
2162 17216 : open_parms->ntcreatex.in.create_options = 0;
2163 17216 : open_parms->ntcreatex.in.fname = fname;
2164 17216 : open_parms->ntcreatex.in.root_fid.fnum = 0;
2165 17216 : }
2166 :
2167 : static int data_file_fd = -1;
2168 :
2169 : #define KNOWN "known"
2170 : #define CHILD "child"
2171 8736 : static bool createx_test_dir(struct torture_context *tctx,
2172 : struct smbcli_tree *tree, int fnum, TALLOC_CTX *mem_ctx, NTSTATUS *result)
2173 : {
2174 8736 : bool ret = true;
2175 0 : NTSTATUS status;
2176 0 : union smb_open open_parms;
2177 :
2178 : /* bypass original handle to guarantee creation */
2179 8736 : ZERO_STRUCT(open_parms);
2180 8736 : open_parms.generic.level = RAW_OPEN_NTCREATEX;
2181 8736 : open_parms.ntcreatex.in.flags = 0;
2182 8736 : open_parms.ntcreatex.in.access_mask = SEC_RIGHTS_FILE_ALL;
2183 8736 : open_parms.ntcreatex.in.file_attr = FILE_ATTRIBUTE_NORMAL;
2184 8736 : open_parms.ntcreatex.in.share_access = 0;
2185 8736 : open_parms.ntcreatex.in.open_disposition = NTCREATEX_DISP_CREATE;
2186 8736 : open_parms.ntcreatex.in.create_options = 0;
2187 8736 : open_parms.ntcreatex.in.fname = CREATEX_NAME "\\" KNOWN;
2188 :
2189 8736 : status = smb_raw_open(tree, mem_ctx, &open_parms);
2190 8736 : CHECK_STATUS(status, NT_STATUS_OK);
2191 8736 : smbcli_close(tree, open_parms.ntcreatex.out.file.fnum);
2192 :
2193 8736 : result[CXD_DIR_ENUMERATE] = NT_STATUS_OK;
2194 :
2195 : /* try to create a child */
2196 8736 : ZERO_STRUCT(open_parms);
2197 8736 : open_parms.generic.level = RAW_OPEN_NTCREATEX;
2198 8736 : open_parms.ntcreatex.in.flags = 0;
2199 8736 : open_parms.ntcreatex.in.access_mask = SEC_RIGHTS_FILE_ALL;
2200 8736 : open_parms.ntcreatex.in.file_attr = FILE_ATTRIBUTE_NORMAL;
2201 8736 : open_parms.ntcreatex.in.share_access = 0;
2202 8736 : open_parms.ntcreatex.in.open_disposition = NTCREATEX_DISP_CREATE;
2203 8736 : open_parms.ntcreatex.in.create_options = 0;
2204 8736 : open_parms.ntcreatex.in.fname = CHILD;
2205 8736 : open_parms.ntcreatex.in.root_fid.fnum = fnum;
2206 :
2207 8736 : result[CXD_DIR_CREATE_CHILD] =
2208 8736 : smb_raw_open(tree, mem_ctx, &open_parms);
2209 8736 : smbcli_close(tree, open_parms.ntcreatex.out.file.fnum);
2210 :
2211 : /* try to traverse dir to known good file */
2212 8736 : ZERO_STRUCT(open_parms);
2213 8736 : open_parms.generic.level = RAW_OPEN_NTCREATEX;
2214 8736 : open_parms.ntcreatex.in.flags = 0;
2215 8736 : open_parms.ntcreatex.in.access_mask = SEC_RIGHTS_FILE_ALL;
2216 8736 : open_parms.ntcreatex.in.file_attr = FILE_ATTRIBUTE_NORMAL;
2217 8736 : open_parms.ntcreatex.in.share_access = 0;
2218 8736 : open_parms.ntcreatex.in.open_disposition = NTCREATEX_DISP_OPEN;
2219 8736 : open_parms.ntcreatex.in.create_options = 0;
2220 8736 : open_parms.ntcreatex.in.fname = KNOWN;
2221 8736 : open_parms.ntcreatex.in.root_fid.fnum = fnum;
2222 :
2223 8736 : result[CXD_DIR_TRAVERSE] =
2224 8736 : smb_raw_open(tree, mem_ctx, &open_parms);
2225 :
2226 :
2227 8736 : smbcli_close(tree, open_parms.ntcreatex.out.file.fnum);
2228 8736 : smbcli_unlink(tree, CREATEX_NAME "\\" KNOWN);
2229 8736 : smbcli_unlink(tree, CREATEX_NAME "\\" CHILD);
2230 :
2231 8736 : done:
2232 8736 : return ret;
2233 : }
2234 :
2235 16928 : static bool createx_test_file(struct torture_context *tctx,
2236 : struct smbcli_tree *tree, int fnum, TALLOC_CTX *mem_ctx, NTSTATUS *result)
2237 : {
2238 0 : union smb_read rd;
2239 0 : union smb_write wr;
2240 16928 : char buf[256] = "";
2241 :
2242 16928 : memset(&rd, 0, sizeof(rd));
2243 16928 : rd.readx.level = RAW_READ_READX;
2244 16928 : rd.readx.in.file.fnum = fnum;
2245 16928 : rd.readx.in.mincnt = sizeof(buf);
2246 16928 : rd.readx.in.maxcnt = sizeof(buf);
2247 16928 : rd.readx.out.data = (uint8_t *)buf;
2248 :
2249 16928 : result[CXD_FILE_READ] = smb_raw_read(tree, &rd);
2250 :
2251 16928 : memset(&wr, 0, sizeof(wr));
2252 16928 : wr.writex.level = RAW_WRITE_WRITEX;
2253 16928 : wr.writex.in.file.fnum = fnum;
2254 16928 : wr.writex.in.count = sizeof(buf);
2255 16928 : wr.writex.in.data = (uint8_t *)buf;
2256 :
2257 16928 : result[CXD_FILE_WRITE] = smb_raw_write(tree, &wr);
2258 :
2259 16928 : memset(&rd, 0, sizeof(rd));
2260 16928 : rd.readx.level = RAW_READ_READX;
2261 16928 : rd.readx.in.file.fnum = fnum;
2262 16928 : rd.readx.in.mincnt = sizeof(buf);
2263 16928 : rd.readx.in.maxcnt = sizeof(buf);
2264 16928 : rd.readx.in.read_for_execute = 1;
2265 16928 : rd.readx.out.data = (uint8_t *)buf;
2266 :
2267 16928 : result[CXD_FILE_EXECUTE] = smb_raw_read(tree, &rd);
2268 :
2269 16928 : return true;
2270 : }
2271 :
2272 : /* TODO When redirecting stdout to a file, the progress bar really screws up
2273 : * the output. Could use a switch "--noprogress", or direct the progress bar to
2274 : * stderr? No other solution? */
2275 13816 : static void createx_progress_bar(struct torture_context *tctx, unsigned int i,
2276 : unsigned int total, unsigned int skipped)
2277 : {
2278 13816 : if (torture_setting_bool(tctx, "progress", true)) {
2279 0 : torture_comment(tctx, "%5d/%5d (%d skipped)\r", i, total,
2280 : skipped);
2281 0 : fflush(stdout);
2282 : }
2283 13816 : }
2284 :
2285 13952 : static bool torture_createx_specific(struct torture_context *tctx, struct
2286 : smbcli_state *cli, struct smbcli_state *cli2, TALLOC_CTX *mem_ctx, struct
2287 : createx_data *cxd, int estimated_count)
2288 : {
2289 0 : static int call_count = 1;
2290 0 : static int unskipped_call_count = 1;
2291 13952 : const char *fname = CREATEX_NAME;
2292 13952 : int fnum = -1, fnum2 = -1, res, i;
2293 0 : union smb_open open_parms1, open_parms2;
2294 13952 : bool ret = true;
2295 13952 : bool is_dir = cxd->cxd_flags & CXD_FLAGS_DIRECTORY;
2296 13952 : NTSTATUS *result = &cxd->cxd_result[0];
2297 13952 : NTSTATUS *result2 = &cxd->cxd_result2[0];
2298 13952 : bool found = false, failed = false;
2299 :
2300 0 : bool (*make_func)(struct torture_context *,
2301 : struct smbcli_tree *, TALLOC_CTX *, const char *);
2302 0 : void (*fill_func)(union smb_open *, int, int, const char *);
2303 0 : bool (*test_func)(struct torture_context *,
2304 : struct smbcli_tree *, int, TALLOC_CTX *, NTSTATUS *);
2305 0 : NTSTATUS (*destroy_func)(struct smbcli_tree *, const char *);
2306 :
2307 13952 : if (is_dir) {
2308 4928 : make_func = createx_make_dir;
2309 4928 : fill_func = createx_fill_dir;
2310 4928 : test_func = createx_test_dir;
2311 4928 : destroy_func = smbcli_rmdir;
2312 : } else {
2313 9024 : make_func = createx_make_file;
2314 9024 : fill_func = createx_fill_file;
2315 9024 : test_func = createx_test_file;
2316 9024 : destroy_func = smbcli_unlink;
2317 : }
2318 :
2319 : /* Skip all SACL related tests. */
2320 13952 : if ((!torture_setting_bool(tctx, "sacl_support", true)) &&
2321 0 : ((cxd->cxd_access1 & SEC_FLAG_SYSTEM_SECURITY) ||
2322 0 : (cxd->cxd_access2 & SEC_FLAG_SYSTEM_SECURITY)))
2323 0 : goto done;
2324 :
2325 13952 : if (cxd->cxd_flags & CXD_FLAGS_MAKE_BEFORE_CREATEX) {
2326 832 : ret = make_func(tctx, cli->tree, mem_ctx, fname);
2327 832 : if (!ret) {
2328 0 : torture_result(tctx, TORTURE_FAIL,
2329 : "Initial creation failed\n");
2330 0 : goto done;
2331 : }
2332 : }
2333 :
2334 : /* Initialize. */
2335 13952 : fill_func(&open_parms1, cxd->cxd_access1, cxd->cxd_sharemode1, fname);
2336 :
2337 13952 : if (cxd->cxd_test == CXD_TEST_CREATEX_SHAREMODE) {
2338 12288 : fill_func(&open_parms2, cxd->cxd_access2, cxd->cxd_sharemode2,
2339 : fname);
2340 : }
2341 :
2342 55808 : for (i = CXD_CREATEX + 1; i < CXD_MAX; i++) {
2343 41856 : result[i] = NT_STATUS_UNSUCCESSFUL;
2344 41856 : result2[i] = NT_STATUS_UNSUCCESSFUL;
2345 : }
2346 :
2347 : /* Perform open(s). */
2348 13952 : result[CXD_CREATEX] = smb_raw_open(cli->tree, mem_ctx, &open_parms1);
2349 13952 : if (NT_STATUS_IS_OK(result[CXD_CREATEX])) {
2350 13376 : fnum = open_parms1.ntcreatex.out.file.fnum;
2351 13376 : ret = test_func(tctx, cli->tree, fnum, mem_ctx, result);
2352 13376 : smbcli_close(cli->tree, fnum);
2353 : }
2354 :
2355 13952 : if (cxd->cxd_test == CXD_TEST_CREATEX_SHAREMODE) {
2356 12288 : result2[CXD_CREATEX] = smb_raw_open(cli2->tree, mem_ctx,
2357 : &open_parms2);
2358 12288 : if (NT_STATUS_IS_OK(result2[CXD_CREATEX])) {
2359 12288 : fnum2 = open_parms2.ntcreatex.out.file.fnum;
2360 12288 : ret = test_func(tctx, cli2->tree, fnum2, mem_ctx,
2361 : result2);
2362 12288 : smbcli_close(cli2->tree, fnum2);
2363 : }
2364 : }
2365 :
2366 13952 : if (data_file_fd >= 0) {
2367 0 : size_t cxd_len = sizeof(struct createx_data);
2368 0 : found = true;
2369 0 : res = write(data_file_fd, cxd, cxd_len);
2370 0 : if (res != cxd_len) {
2371 0 : torture_result(tctx, TORTURE_FAIL,
2372 : "(%s): write failed: %s!",
2373 0 : __location__, strerror(errno));
2374 0 : ret = false;
2375 : }
2376 13952 : } else if ((res = cxd_find_known(cxd)) >= 0) {
2377 13952 : found = true;
2378 67456 : for (i = 0; i < CXD_MAX; i++) {
2379 : /* Note: COMPARE_STATUS will set the "failed" bool. */
2380 54080 : COMPARE_STATUS(result[i], cxd_known[res].cxd_result[i]);
2381 54080 : if (i == 0 && !NT_STATUS_IS_OK(result[i]))
2382 576 : break;
2383 :
2384 53504 : if (cxd->cxd_test == CXD_TEST_CREATEX_SHAREMODE) {
2385 49152 : COMPARE_STATUS(result2[i],
2386 : cxd_known[res].cxd_result2[i]);
2387 49152 : if (i == 0 && !NT_STATUS_IS_OK(result2[i]))
2388 0 : break;
2389 : }
2390 : }
2391 : }
2392 :
2393 : /* We print if its not in the "cxd_known" list or if we fail. */
2394 13952 : if (!found || failed) {
2395 136 : torture_comment(tctx,
2396 : " { .cxd_test = %d, .cxd_flags = %#3x, "
2397 : ".cxd_access1 = %#10x, .cxd_sharemode1=%1x, "
2398 : ".cxd_access2=%#10x, .cxd_sharemode2=%1x, "
2399 136 : ".cxd_result = { ", cxd->cxd_test, cxd->cxd_flags,
2400 : cxd->cxd_access1, cxd->cxd_sharemode1, cxd->cxd_access2,
2401 : cxd->cxd_sharemode2);
2402 680 : for (i = 0; i < CXD_MAX; i++) {
2403 544 : torture_comment(tctx, "%s, ", nt_errstr(result[i]));
2404 544 : if (i == 0 && !NT_STATUS_IS_OK(result[i]))
2405 0 : break;
2406 : }
2407 136 : torture_comment(tctx, "}");
2408 136 : if (cxd->cxd_test == CXD_TEST_CREATEX_SHAREMODE) {
2409 0 : torture_comment(tctx, ", .cxd_result2 = { ");
2410 0 : for (i = 0; i < CXD_MAX; i++) {
2411 0 : torture_comment(tctx, "%s, ",
2412 0 : nt_errstr(result2[i]));
2413 0 : if (i == 0 && !NT_STATUS_IS_OK(result2[i]))
2414 0 : break;
2415 : }
2416 0 : torture_comment(tctx, "}");
2417 : }
2418 136 : torture_comment(tctx, "}, \n");
2419 : } else {
2420 13816 : createx_progress_bar(tctx, call_count, estimated_count,
2421 13816 : call_count - unskipped_call_count);
2422 : }
2423 : /* Count tests that we didn't skip. */
2424 13952 : unskipped_call_count++;
2425 13952 : done:
2426 13952 : call_count++;
2427 :
2428 13952 : destroy_func(cli->tree, fname);
2429 13952 : return ret;
2430 : }
2431 :
2432 : uint32_t sec_access_bit_groups[] = {
2433 : SEC_RIGHTS_FILE_READ,
2434 : SEC_RIGHTS_FILE_WRITE,
2435 : SEC_RIGHTS_FILE_EXECUTE
2436 : };
2437 : #define NUM_ACCESS_GROUPS (sizeof(sec_access_bit_groups) / sizeof(uint32_t))
2438 : #define ACCESS_GROUPS_COUNT ((1 << NUM_ACCESS_GROUPS))
2439 : #define BITSINBYTE 8
2440 :
2441 : /* Note: See NTCREATEX_SHARE_ACCESS_{NONE,READ,WRITE,DELETE} for share mode
2442 : * declarations. */
2443 : #define NUM_SHAREMODE_PERMUTATIONS 8
2444 :
2445 : /**
2446 : * NTCREATEX and SHARE MODE test.
2447 : *
2448 : * Open with combinations of (access_mode, share_mode).
2449 : * - Check status
2450 : * Open 2nd time with combination of (access_mode2, share_mode2).
2451 : * - Check status
2452 : * Perform operations to verify?
2453 : * - Read
2454 : * - Write
2455 : * - Delete
2456 : */
2457 3 : bool torture_createx_sharemodes(struct torture_context *tctx,
2458 : struct smbcli_state *cli,
2459 : struct smbcli_state *cli2,
2460 : bool dir,
2461 : bool extended)
2462 : {
2463 0 : TALLOC_CTX *mem_ctx;
2464 3 : bool ret = true;
2465 0 : int i, j, est;
2466 0 : int gp1, gp2; /* group permuters */
2467 3 : struct createx_data cxd = {0};
2468 3 : int num_access_bits1 = sizeof(cxd.cxd_access1) * BITSINBYTE;
2469 3 : int num_access_bits2 = sizeof(cxd.cxd_access2) * BITSINBYTE;
2470 :
2471 3 : mem_ctx = talloc_init("createx_sharemodes");
2472 3 : if (!mem_ctx)
2473 0 : return false;
2474 :
2475 3 : if (!torture_setting_bool(tctx, "sacl_support", true))
2476 0 : torture_warning(tctx, "Skipping SACL related tests!\n");
2477 :
2478 3 : cxd.cxd_test = extended ? CXD_TEST_CREATEX_SHAREMODE_EXTENDED :
2479 : CXD_TEST_CREATEX_SHAREMODE;
2480 3 : cxd.cxd_flags = dir ? CXD_FLAGS_DIRECTORY: 0;
2481 :
2482 : /* HACK for progress bar: figure out estimated count. */
2483 3 : est = (NUM_SHAREMODE_PERMUTATIONS * NUM_SHAREMODE_PERMUTATIONS) *
2484 0 : ((ACCESS_GROUPS_COUNT * ACCESS_GROUPS_COUNT) +
2485 0 : (extended ? num_access_bits1 * num_access_bits2 : 0));
2486 :
2487 : /* Blank slate. */
2488 3 : smbcli_deltree(cli->tree, CREATEX_NAME);
2489 3 : smbcli_unlink(cli->tree, CREATEX_NAME);
2490 :
2491 : /* Choose 2 random share modes. */
2492 3 : for (cxd.cxd_sharemode1 = 0;
2493 27 : cxd.cxd_sharemode1 < NUM_SHAREMODE_PERMUTATIONS;
2494 24 : cxd.cxd_sharemode1++) {
2495 24 : for (cxd.cxd_sharemode2 = 0;
2496 216 : cxd.cxd_sharemode2 < NUM_SHAREMODE_PERMUTATIONS;
2497 192 : cxd.cxd_sharemode2++) {
2498 :
2499 : /* Permutate through our access_bit_groups. */
2500 1728 : for (gp1 = 0; gp1 < ACCESS_GROUPS_COUNT; gp1++) {
2501 13824 : for (gp2 = 0; gp2 < ACCESS_GROUPS_COUNT; gp2++)
2502 : {
2503 12288 : cxd.cxd_access1 = cxd.cxd_access2 = 0;
2504 :
2505 49152 : for (i = 0; i < NUM_ACCESS_GROUPS; i++)
2506 : {
2507 73728 : cxd.cxd_access1 |=
2508 36864 : (gp1 & (1 << i)) ?
2509 36864 : sec_access_bit_groups[i]:0;
2510 36864 : cxd.cxd_access2 |=
2511 36864 : (gp2 & (1 << i)) ?
2512 36864 : sec_access_bit_groups[i]:0;
2513 : }
2514 :
2515 12288 : torture_createx_specific(tctx, cli,
2516 : cli2, mem_ctx, &cxd, est);
2517 : }
2518 : }
2519 :
2520 : /* Only do the single access bits on an extended run. */
2521 192 : if (!extended)
2522 192 : continue;
2523 :
2524 0 : for (i = 0; i < num_access_bits1; i++) {
2525 0 : for (j = 0; j < num_access_bits2; j++) {
2526 0 : cxd.cxd_access1 = 1ull << i;
2527 0 : cxd.cxd_access2 = 1ull << j;
2528 :
2529 0 : torture_createx_specific(tctx, cli,
2530 : cli2, mem_ctx, &cxd, est);
2531 : }
2532 : }
2533 : }
2534 : }
2535 3 : torture_comment(tctx, "\n");
2536 :
2537 3 : talloc_free(mem_ctx);
2538 3 : return ret;
2539 : }
2540 :
2541 2 : bool torture_createx_sharemodes_file(struct torture_context *tctx,
2542 : struct smbcli_state *cli, struct smbcli_state *cli2)
2543 : {
2544 2 : return torture_createx_sharemodes(tctx, cli, cli2, false, false);
2545 : }
2546 :
2547 1 : bool torture_createx_sharemodes_dir(struct torture_context *tctx,
2548 : struct smbcli_state *cli, struct smbcli_state *cli2)
2549 : {
2550 1 : return torture_createx_sharemodes(tctx, cli, cli2, true, false);
2551 : }
2552 :
2553 4 : bool torture_createx_access(struct torture_context *tctx,
2554 : struct smbcli_state *cli)
2555 : {
2556 0 : TALLOC_CTX *mem_ctx;
2557 4 : bool ret = true;
2558 0 : uint32_t group_permuter;
2559 0 : uint32_t i;
2560 4 : struct createx_data cxd = {0};
2561 0 : int est;
2562 4 : int num_access_bits = sizeof(cxd.cxd_access1) * BITSINBYTE;
2563 :
2564 4 : mem_ctx = talloc_init("createx_dir");
2565 4 : if (!mem_ctx)
2566 0 : return false;
2567 :
2568 4 : if (!torture_setting_bool(tctx, "sacl_support", true))
2569 0 : torture_warning(tctx, "Skipping SACL related tests!\n");
2570 :
2571 4 : cxd.cxd_test = CXD_TEST_CREATEX_ACCESS;
2572 :
2573 : /* HACK for progress bar: figure out estimated count. */
2574 4 : est = CXD_FLAGS_COUNT * (ACCESS_GROUPS_COUNT + (num_access_bits * 3));
2575 :
2576 : /* Blank slate. */
2577 4 : smbcli_deltree(cli->tree, CREATEX_NAME);
2578 4 : smbcli_unlink(cli->tree, CREATEX_NAME);
2579 :
2580 20 : for (cxd.cxd_flags = 0; cxd.cxd_flags <= CXD_FLAGS_MASK;
2581 16 : cxd.cxd_flags++) {
2582 : /**
2583 : * This implements a basic permutation of all elements of
2584 : * 'bit_group'. group_permuter is a bit field representing
2585 : * which groups to turn on.
2586 : */
2587 144 : for (group_permuter = 0; group_permuter < (1 <<
2588 128 : NUM_ACCESS_GROUPS); group_permuter++) {
2589 128 : for (i = 0, cxd.cxd_access1 = 0;
2590 512 : i < NUM_ACCESS_GROUPS; i++) {
2591 384 : cxd.cxd_access1 |= (group_permuter & (1 << i))
2592 384 : ? sec_access_bit_groups[i] : 0;
2593 : }
2594 :
2595 128 : torture_createx_specific(tctx, cli, NULL, mem_ctx,
2596 : &cxd, est);
2597 : }
2598 528 : for (i = 0; i < num_access_bits; i++) {
2599 : /* And now run through the single access bits. */
2600 512 : cxd.cxd_access1 = 1 << i;
2601 512 : torture_createx_specific(tctx, cli, NULL, mem_ctx,
2602 : &cxd, est);
2603 :
2604 : /* Does SEC_FLAG_MAXIMUM_ALLOWED override? */
2605 512 : cxd.cxd_access1 |= SEC_FLAG_MAXIMUM_ALLOWED;
2606 512 : torture_createx_specific(tctx, cli, NULL, mem_ctx,
2607 : &cxd, est);
2608 :
2609 : /* What about SEC_FLAG_SYSTEM_SECURITY? */
2610 512 : cxd.cxd_access1 |= SEC_FLAG_SYSTEM_SECURITY;
2611 512 : torture_createx_specific(tctx, cli, NULL, mem_ctx,
2612 : &cxd, est);
2613 : }
2614 : }
2615 :
2616 4 : talloc_free(mem_ctx);
2617 4 : return ret;
2618 : }
2619 :
2620 : #define ACCESS_KNOWN_MASK 0xF31F01FFull
2621 :
2622 0 : bool torture_createx_access_exhaustive(struct torture_context *tctx,
2623 : struct smbcli_state *cli)
2624 : {
2625 0 : char *data_file;
2626 0 : TALLOC_CTX *mem_ctx;
2627 0 : bool ret = true, first;
2628 0 : uint32_t i;
2629 0 : struct createx_data cxd = {0};
2630 :
2631 0 : mem_ctx = talloc_init("createx_dir");
2632 0 : if (!mem_ctx)
2633 0 : return false;
2634 :
2635 0 : if (!torture_setting_bool(tctx, "sacl_support", true))
2636 0 : torture_warning(tctx, "Skipping SACL related tests!\n");
2637 :
2638 0 : data_file = getenv("CREATEX_DATA");
2639 0 : if (data_file) {
2640 0 : data_file_fd = open(data_file, O_WRONLY|O_CREAT|O_TRUNC, 0666);
2641 0 : if (data_file_fd < 0) {
2642 0 : torture_result(tctx, TORTURE_FAIL,
2643 : "(%s): data file open failed: %s!",
2644 0 : __location__, strerror(errno));
2645 0 : ret = false;
2646 0 : goto done;
2647 : }
2648 : }
2649 :
2650 : /* Blank slate. */
2651 0 : smbcli_deltree(cli->tree, CREATEX_NAME);
2652 0 : smbcli_unlink(cli->tree, CREATEX_NAME);
2653 :
2654 0 : cxd.cxd_test = CXD_TEST_CREATEX_ACCESS_EXHAUSTIVE;
2655 :
2656 0 : for (cxd.cxd_flags = 0; cxd.cxd_flags <= CXD_FLAGS_MASK;
2657 0 : cxd.cxd_flags++) {
2658 0 : for (i = 0, first = true; (i != 0) || first; first = false,
2659 0 : i = ((i | ~ACCESS_KNOWN_MASK) + 1) & ACCESS_KNOWN_MASK) {
2660 0 : cxd.cxd_access1 = i;
2661 0 : ret = torture_createx_specific(tctx, cli, NULL,
2662 : mem_ctx, &cxd, 0);
2663 0 : if (!ret)
2664 0 : break;
2665 : }
2666 : }
2667 :
2668 0 : close(data_file_fd);
2669 0 : data_file_fd = -1;
2670 :
2671 0 : done:
2672 0 : talloc_free(mem_ctx);
2673 0 : return ret;
2674 : }
2675 :
2676 : #define MAXIMUM_ALLOWED_FILE "torture_maximum_allowed"
2677 2 : bool torture_maximum_allowed(struct torture_context *tctx,
2678 : struct smbcli_state *cli)
2679 : {
2680 0 : struct security_descriptor *sd, *sd_orig;
2681 0 : union smb_open io;
2682 0 : static TALLOC_CTX *mem_ctx;
2683 2 : int fnum, fnum1 = -1, i;
2684 2 : bool ret = true;
2685 0 : NTSTATUS status;
2686 0 : union smb_fileinfo q;
2687 0 : union smb_setfileinfo set;
2688 0 : const char *owner_sid;
2689 0 : bool has_restore_privilege, has_backup_privilege, has_system_security_privilege;
2690 :
2691 2 : mem_ctx = talloc_init("torture_maximum_allowed");
2692 :
2693 2 : if (!torture_setting_bool(tctx, "sacl_support", true))
2694 0 : torture_warning(tctx, "Skipping SACL related tests!\n");
2695 :
2696 2 : sd = security_descriptor_dacl_create(mem_ctx,
2697 : 0, NULL, NULL,
2698 : SID_NT_AUTHENTICATED_USERS,
2699 : SEC_ACE_TYPE_ACCESS_ALLOWED,
2700 : SEC_RIGHTS_FILE_READ,
2701 : 0, NULL);
2702 :
2703 : /* Blank slate */
2704 2 : smbcli_unlink(cli->tree, MAXIMUM_ALLOWED_FILE);
2705 :
2706 : /* create initial file with restrictive SD */
2707 2 : memset(&io, 0, sizeof(io));
2708 2 : io.generic.level = RAW_OPEN_NTTRANS_CREATE;
2709 2 : io.ntcreatex.in.access_mask = SEC_RIGHTS_FILE_ALL;
2710 2 : io.ntcreatex.in.file_attr = FILE_ATTRIBUTE_NORMAL;
2711 2 : io.ntcreatex.in.open_disposition = NTCREATEX_DISP_CREATE;
2712 2 : io.ntcreatex.in.impersonation = NTCREATEX_IMPERSONATION_ANONYMOUS;
2713 2 : io.ntcreatex.in.fname = MAXIMUM_ALLOWED_FILE;
2714 2 : io.ntcreatex.in.sec_desc = sd;
2715 :
2716 2 : status = smb_raw_open(cli->tree, mem_ctx, &io);
2717 2 : CHECK_STATUS(status, NT_STATUS_OK);
2718 2 : fnum = io.ntcreatex.out.file.fnum;
2719 :
2720 : /* the correct answers for this test depends on whether the
2721 : user has restore privileges. To find that out we first need
2722 : to know our SID - get it from the owner_sid of the file we
2723 : just created */
2724 2 : q.query_secdesc.level = RAW_FILEINFO_SEC_DESC;
2725 2 : q.query_secdesc.in.file.fnum = fnum;
2726 2 : q.query_secdesc.in.secinfo_flags = SECINFO_DACL | SECINFO_OWNER;
2727 2 : status = smb_raw_fileinfo(cli->tree, tctx, &q);
2728 2 : CHECK_STATUS(status, NT_STATUS_OK);
2729 2 : sd_orig = q.query_secdesc.out.sd;
2730 :
2731 2 : owner_sid = dom_sid_string(tctx, sd_orig->owner_sid);
2732 :
2733 2 : status = torture_check_privilege(cli,
2734 : owner_sid,
2735 : sec_privilege_name(SEC_PRIV_RESTORE));
2736 2 : has_restore_privilege = NT_STATUS_IS_OK(status);
2737 2 : torture_comment(tctx, "Checked SEC_PRIV_RESTORE for %s - %s\n",
2738 : owner_sid,
2739 : has_restore_privilege?"Yes":"No");
2740 :
2741 2 : status = torture_check_privilege(cli,
2742 : owner_sid,
2743 : sec_privilege_name(SEC_PRIV_BACKUP));
2744 2 : has_backup_privilege = NT_STATUS_IS_OK(status);
2745 2 : torture_comment(tctx, "Checked SEC_PRIV_BACKUP for %s - %s\n",
2746 : owner_sid,
2747 : has_backup_privilege?"Yes":"No");
2748 :
2749 2 : status = torture_check_privilege(cli,
2750 : owner_sid,
2751 : sec_privilege_name(SEC_PRIV_SECURITY));
2752 2 : has_system_security_privilege = NT_STATUS_IS_OK(status);
2753 2 : torture_comment(tctx, "Checked SEC_PRIV_SECURITY for %s - %s\n",
2754 : owner_sid,
2755 : has_system_security_privilege?"Yes":"No");
2756 :
2757 2 : smbcli_close(cli->tree, fnum);
2758 :
2759 4 : for (i = 0; i < 32; i++) {
2760 4 : uint32_t mask = SEC_FLAG_MAXIMUM_ALLOWED | (1u << i);
2761 : /*
2762 : * SEC_GENERIC_EXECUTE is a complete subset of
2763 : * SEC_GENERIC_READ when mapped to specific bits,
2764 : * so we need to include it in the basic OK mask.
2765 : */
2766 4 : uint32_t ok_mask = SEC_RIGHTS_FILE_READ | SEC_GENERIC_READ | SEC_GENERIC_EXECUTE |
2767 : SEC_STD_DELETE | SEC_STD_WRITE_DAC;
2768 :
2769 : /*
2770 : * Now SEC_RIGHTS_PRIV_RESTORE and SEC_RIGHTS_PRIV_BACKUP
2771 : * don't include any generic bits (they're used directly
2772 : * in the fileserver where the generic bits have already
2773 : * been mapped into file specific bits) we need to add the
2774 : * generic bits to the ok_mask when we have these privileges.
2775 : */
2776 4 : if (has_restore_privilege) {
2777 4 : ok_mask |= SEC_RIGHTS_PRIV_RESTORE|SEC_GENERIC_WRITE;
2778 : }
2779 4 : if (has_backup_privilege) {
2780 4 : ok_mask |= SEC_RIGHTS_PRIV_BACKUP|SEC_GENERIC_READ;
2781 : }
2782 4 : if (has_system_security_privilege) {
2783 4 : ok_mask |= SEC_FLAG_SYSTEM_SECURITY;
2784 : }
2785 :
2786 : /* Skip all SACL related tests. */
2787 4 : if ((!torture_setting_bool(tctx, "sacl_support", true)) &&
2788 0 : (mask & SEC_FLAG_SYSTEM_SECURITY))
2789 0 : continue;
2790 :
2791 4 : memset(&io, 0, sizeof(io));
2792 4 : io.generic.level = RAW_OPEN_NTTRANS_CREATE;
2793 4 : io.ntcreatex.in.access_mask = mask;
2794 4 : io.ntcreatex.in.file_attr = FILE_ATTRIBUTE_NORMAL;
2795 4 : io.ntcreatex.in.open_disposition = NTCREATEX_DISP_OPEN;
2796 4 : io.ntcreatex.in.impersonation =
2797 : NTCREATEX_IMPERSONATION_ANONYMOUS;
2798 4 : io.ntcreatex.in.fname = MAXIMUM_ALLOWED_FILE;
2799 :
2800 4 : status = smb_raw_open(cli->tree, mem_ctx, &io);
2801 4 : if (mask & ok_mask ||
2802 : mask == SEC_FLAG_MAXIMUM_ALLOWED) {
2803 4 : CHECK_STATUS(status, NT_STATUS_OK);
2804 : } else {
2805 0 : if (mask & SEC_FLAG_SYSTEM_SECURITY) {
2806 0 : CHECK_STATUS(status, NT_STATUS_PRIVILEGE_NOT_HELD);
2807 : } else {
2808 0 : CHECK_STATUS(status, NT_STATUS_ACCESS_DENIED);
2809 : }
2810 : }
2811 :
2812 2 : fnum = io.ntcreatex.out.file.fnum;
2813 :
2814 2 : smbcli_close(cli->tree, fnum);
2815 : }
2816 :
2817 0 : io.generic.level = RAW_OPEN_NTTRANS_CREATE;
2818 0 : io.ntcreatex.in.access_mask = SEC_STD_WRITE_DAC;
2819 0 : io.ntcreatex.in.file_attr = FILE_ATTRIBUTE_NORMAL;
2820 0 : io.ntcreatex.in.open_disposition = NTCREATEX_DISP_OPEN;
2821 0 : io.ntcreatex.in.impersonation = NTCREATEX_IMPERSONATION_ANONYMOUS;
2822 0 : io.ntcreatex.in.fname = MAXIMUM_ALLOWED_FILE;
2823 :
2824 0 : status = smb_raw_open(cli->tree, mem_ctx, &io);
2825 0 : CHECK_STATUS(status, NT_STATUS_OK);
2826 0 : fnum1 = io.ntcreatex.out.file.fnum;
2827 :
2828 0 : sd = security_descriptor_dacl_create(tctx,
2829 : 0, NULL, NULL,
2830 : SID_NT_AUTHENTICATED_USERS,
2831 : SEC_ACE_TYPE_ACCESS_ALLOWED,
2832 : SEC_STD_DELETE,
2833 : 0,
2834 : NULL);
2835 0 : set.set_secdesc.level = RAW_SFILEINFO_SEC_DESC;
2836 0 : set.set_secdesc.in.file.fnum = fnum1;
2837 0 : set.set_secdesc.in.secinfo_flags = SECINFO_DACL;
2838 0 : set.set_secdesc.in.sd = sd;
2839 :
2840 0 : status = smb_raw_setfileinfo(cli->tree, &set);
2841 0 : CHECK_STATUS(status, NT_STATUS_OK);
2842 :
2843 2 : done:
2844 2 : smbcli_close(cli->tree, fnum1);
2845 2 : smbcli_unlink(cli->tree, MAXIMUM_ALLOWED_FILE);
2846 2 : return ret;
2847 : }
|