source: trunk/server/source4/torture/basic/denytest.c

Last change on this file was 745, checked in by Silvan Scherrer, 13 years ago

Samba Server: updated trunk to 3.6.0

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