Windows: AFSInvalidateObject can overwrite input param
[openafs.git] / src / WINNT / afsrdr / kernel / fs / AFSSecurity.cpp
1 /*
2  * Copyright (c) 2008, 2009, 2010, 2011 Kernel Drivers, LLC.
3  * Copyright (c) 2009, 2010, 2011 Your File System, Inc.
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  *
10  * - Redistributions of source code must retain the above copyright notice,
11  *   this list of conditions and the following disclaimer.
12  * - Redistributions in binary form must reproduce the above copyright
13  *   notice,
14  *   this list of conditions and the following disclaimer in the
15  *   documentation
16  *   and/or other materials provided with the distribution.
17  * - Neither the names of Kernel Drivers, LLC and Your File System, Inc.
18  *   nor the names of their contributors may be used to endorse or promote
19  *   products derived from this software without specific prior written
20  *   permission from Kernel Drivers, LLC and Your File System, Inc.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
24  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
25  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
26  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
27  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
28  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
29  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
30  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
31  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
32  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33  */
34
35 //
36 // File: AFSSecurity.cpp
37 //
38
39 #include "AFSCommon.h"
40
41 NTSTATUS
42 AFSSetSecurity( IN PDEVICE_OBJECT DeviceObject,
43                 IN PIRP Irp)
44 {
45
46     NTSTATUS ntStatus = STATUS_NOT_SUPPORTED;
47     IO_STACK_LOCATION *pIrpSp;
48     AFSDeviceExt *pControlDeviceExt = (AFSDeviceExt *)AFSDeviceObject->DeviceExtension;
49     AFSFcb* pFcb = NULL;
50
51     pIrpSp = IoGetCurrentIrpStackLocation( Irp);
52
53     __try
54     {
55
56         AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
57                       AFS_TRACE_LEVEL_VERBOSE,
58                       "AFSSetSecurity Entry for FO %08lX\n",
59                       pIrpSp->FileObject);
60
61         if( DeviceObject == AFSDeviceObject)
62         {
63
64             ntStatus = STATUS_INVALID_DEVICE_REQUEST;
65
66             AFSCompleteRequest( Irp,
67                                 ntStatus);
68
69             try_return( ntStatus);
70         }
71
72         pFcb = (AFSFcb*) pIrpSp->FileObject->FsContext;
73
74         if( pFcb == NULL ||
75             pFcb->Header.NodeTypeCode == AFS_REDIRECTOR_FCB)
76         {
77
78             //
79             // Root open
80             //
81
82             ntStatus = STATUS_INVALID_DEVICE_REQUEST;
83
84             AFSCompleteRequest( Irp,
85                                 ntStatus);
86
87             try_return( ntStatus);
88         }
89
90         //
91         // Check the state of the library
92         //
93
94         ntStatus = AFSCheckLibraryState( Irp);
95
96         if( !NT_SUCCESS( ntStatus) ||
97             ntStatus == STATUS_PENDING)
98         {
99
100             if( ntStatus != STATUS_PENDING)
101             {
102                 AFSCompleteRequest( Irp, ntStatus);
103             }
104
105             try_return( ntStatus);
106         }
107
108         IoSkipCurrentIrpStackLocation( Irp);
109
110         ntStatus = IoCallDriver( pControlDeviceExt->Specific.Control.LibraryDeviceObject,
111                                  Irp);
112
113         //
114         // Indicate the library is done with the request
115         //
116
117         AFSClearLibraryRequest();
118
119 try_exit:
120
121         NOTHING;
122     }
123     __except( AFSExceptionFilter( GetExceptionCode(), GetExceptionInformation()) )
124     {
125
126         AFSDbgLogMsg( 0,
127                       0,
128                       "EXCEPTION - AFSSetSecurity\n");
129     }
130
131     return ntStatus;
132 }
133
134 NTSTATUS
135 AFSQuerySecurity( IN PDEVICE_OBJECT DeviceObject,
136                   IN PIRP Irp)
137 {
138
139     NTSTATUS ntStatus = STATUS_NOT_SUPPORTED;
140     IO_STACK_LOCATION *pIrpSp;
141     AFSDeviceExt *pControlDeviceExt = (AFSDeviceExt *)AFSDeviceObject->DeviceExtension;
142     AFSFcb* pFcb = NULL;
143
144     pIrpSp = IoGetCurrentIrpStackLocation( Irp);
145
146     __try
147     {
148
149         AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
150                       AFS_TRACE_LEVEL_VERBOSE,
151                       "AFSQuerySecurity Entry for FO %08lX\n",
152                       pIrpSp->FileObject);
153
154         if( DeviceObject == AFSDeviceObject)
155         {
156
157             ntStatus = STATUS_INVALID_DEVICE_REQUEST;
158
159             AFSCompleteRequest( Irp,
160                                 ntStatus);
161
162             try_return( ntStatus);
163         }
164
165         pFcb = (AFSFcb*) pIrpSp->FileObject->FsContext;
166
167         if( pFcb == NULL ||
168             pFcb->Header.NodeTypeCode == AFS_REDIRECTOR_FCB)
169         {
170
171             //
172             // Root open
173             //
174
175             ntStatus = STATUS_INVALID_DEVICE_REQUEST;
176
177             AFSCompleteRequest( Irp,
178                                 ntStatus);
179
180             try_return( ntStatus);
181         }
182
183         //
184         // Check the state of the library
185         //
186
187         ntStatus = AFSCheckLibraryState( Irp);
188
189         if( !NT_SUCCESS( ntStatus) ||
190             ntStatus == STATUS_PENDING)
191         {
192
193             if( ntStatus != STATUS_PENDING)
194             {
195                 AFSCompleteRequest( Irp, ntStatus);
196             }
197
198             try_return( ntStatus);
199         }
200
201         IoSkipCurrentIrpStackLocation( Irp);
202
203         ntStatus = IoCallDriver( pControlDeviceExt->Specific.Control.LibraryDeviceObject,
204                                  Irp);
205
206         //
207         // Indicate the library is done with the request
208         //
209
210         AFSClearLibraryRequest();
211
212 try_exit:
213
214         NOTHING;
215     }
216     __except( AFSExceptionFilter( GetExceptionCode(), GetExceptionInformation()) )
217     {
218
219         AFSDbgLogMsg( 0,
220                       0,
221                       "EXCEPTION - AFSQuerySecurity\n");
222     }
223
224     return ntStatus;
225 }