Fossil SCM

Possible fix for [56bafbab54]: unable to use network drive. Theory is that the AccessCheck() call failes because there are more than one Privileges in use. See: [http://msdn.microsoft.com/en-us/library/windows/desktop/aa374815%28v=vs.85%29.aspx]

jan.nijtmans 2014-04-29 11:48 UTC trunk
Commit 969f0a2611bcc83cb0b8ddb6020bb94a8a569132
1 file changed +22 -5
+22 -5
--- src/winfile.c
+++ src/winfile.c
@@ -54,21 +54,21 @@
5454
** 8.6 and then modified.
5555
*/
5656
int win32_access(const wchar_t *zFilename, int flags){
5757
int rc = 0;
5858
PSECURITY_DESCRIPTOR pSd = NULL;
59
- unsigned long size;
59
+ unsigned long size = 0;
6060
PSID pSid = NULL;
6161
BOOL sidDefaulted;
6262
BOOL impersonated = FALSE;
6363
SID_IDENTIFIER_AUTHORITY unmapped = {{0, 0, 0, 0, 0, 22}};
6464
GENERIC_MAPPING genMap;
6565
HANDLE hToken = NULL;
6666
DWORD desiredAccess = 0, grantedAccess = 0;
6767
BOOL accessYesNo = FALSE;
68
- PRIVILEGE_SET privSet;
69
- DWORD privSetSize = sizeof(PRIVILEGE_SET);
68
+ PPRIVILEGE_SET pPrivSet = NULL;
69
+ DWORD privSetSize = 0;
7070
DWORD attr = GetFileAttributesW(zFilename);
7171
7272
if( attr==INVALID_FILE_ATTRIBUTES ){
7373
/*
7474
* File might not exist.
@@ -110,11 +110,10 @@
110110
111111
/*
112112
* First find out how big the buffer needs to be.
113113
*/
114114
115
- size = 0;
116115
GetFileSecurityW(zFilename,
117116
OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION |
118117
DACL_SECURITY_INFORMATION | LABEL_SECURITY_INFORMATION,
119118
0, 0, &size);
120119
@@ -213,16 +212,31 @@
213212
memset(&genMap, 0, sizeof(GENERIC_MAPPING));
214213
genMap.GenericRead = FILE_GENERIC_READ;
215214
genMap.GenericWrite = FILE_GENERIC_WRITE;
216215
genMap.GenericExecute = FILE_GENERIC_EXECUTE;
217216
genMap.GenericAll = FILE_ALL_ACCESS;
217
+
218
+ AccessCheck(pSd, hToken, desiredAccess, &genMap, 0,
219
+ &privSetSize, &grantedAccess, &accessYesNo);
220
+ /*
221
+ * Should have failed with ERROR_INSUFFICIENT_BUFFER
222
+ */
223
+
224
+ if( GetLastError()!=ERROR_INSUFFICIENT_BUFFER ){
225
+ rc = -1; goto done;
226
+ }
227
+ pPrivSet = (PPRIVILEGE_SET)HeapAlloc(GetProcessHeap(), 0, privSetSize);
228
+
229
+ if( pPrivSet==NULL ){
230
+ rc = -1; goto done;
231
+ }
218232
219233
/*
220234
* Perform access check using the token.
221235
*/
222236
223
- if( !AccessCheck(pSd, hToken, desiredAccess, &genMap, &privSet,
237
+ if( !AccessCheck(pSd, hToken, desiredAccess, &genMap, pPrivSet,
224238
&privSetSize, &grantedAccess, &accessYesNo) ){
225239
/*
226240
* Unable to perform access check.
227241
*/
228242
@@ -237,10 +251,13 @@
237251
}
238252
if( impersonated ){
239253
RevertToSelf();
240254
impersonated = FALSE;
241255
}
256
+ if( pPrivSet!=NULL ){
257
+ HeapFree(GetProcessHeap(), 0, pPrivSet);
258
+ }
242259
if( pSd!=NULL ){
243260
HeapFree(GetProcessHeap(), 0, pSd);
244261
}
245262
return rc;
246263
}
247264
--- src/winfile.c
+++ src/winfile.c
@@ -54,21 +54,21 @@
54 ** 8.6 and then modified.
55 */
56 int win32_access(const wchar_t *zFilename, int flags){
57 int rc = 0;
58 PSECURITY_DESCRIPTOR pSd = NULL;
59 unsigned long size;
60 PSID pSid = NULL;
61 BOOL sidDefaulted;
62 BOOL impersonated = FALSE;
63 SID_IDENTIFIER_AUTHORITY unmapped = {{0, 0, 0, 0, 0, 22}};
64 GENERIC_MAPPING genMap;
65 HANDLE hToken = NULL;
66 DWORD desiredAccess = 0, grantedAccess = 0;
67 BOOL accessYesNo = FALSE;
68 PRIVILEGE_SET privSet;
69 DWORD privSetSize = sizeof(PRIVILEGE_SET);
70 DWORD attr = GetFileAttributesW(zFilename);
71
72 if( attr==INVALID_FILE_ATTRIBUTES ){
73 /*
74 * File might not exist.
@@ -110,11 +110,10 @@
110
111 /*
112 * First find out how big the buffer needs to be.
113 */
114
115 size = 0;
116 GetFileSecurityW(zFilename,
117 OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION |
118 DACL_SECURITY_INFORMATION | LABEL_SECURITY_INFORMATION,
119 0, 0, &size);
120
@@ -213,16 +212,31 @@
213 memset(&genMap, 0, sizeof(GENERIC_MAPPING));
214 genMap.GenericRead = FILE_GENERIC_READ;
215 genMap.GenericWrite = FILE_GENERIC_WRITE;
216 genMap.GenericExecute = FILE_GENERIC_EXECUTE;
217 genMap.GenericAll = FILE_ALL_ACCESS;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
218
219 /*
220 * Perform access check using the token.
221 */
222
223 if( !AccessCheck(pSd, hToken, desiredAccess, &genMap, &privSet,
224 &privSetSize, &grantedAccess, &accessYesNo) ){
225 /*
226 * Unable to perform access check.
227 */
228
@@ -237,10 +251,13 @@
237 }
238 if( impersonated ){
239 RevertToSelf();
240 impersonated = FALSE;
241 }
 
 
 
242 if( pSd!=NULL ){
243 HeapFree(GetProcessHeap(), 0, pSd);
244 }
245 return rc;
246 }
247
--- src/winfile.c
+++ src/winfile.c
@@ -54,21 +54,21 @@
54 ** 8.6 and then modified.
55 */
56 int win32_access(const wchar_t *zFilename, int flags){
57 int rc = 0;
58 PSECURITY_DESCRIPTOR pSd = NULL;
59 unsigned long size = 0;
60 PSID pSid = NULL;
61 BOOL sidDefaulted;
62 BOOL impersonated = FALSE;
63 SID_IDENTIFIER_AUTHORITY unmapped = {{0, 0, 0, 0, 0, 22}};
64 GENERIC_MAPPING genMap;
65 HANDLE hToken = NULL;
66 DWORD desiredAccess = 0, grantedAccess = 0;
67 BOOL accessYesNo = FALSE;
68 PPRIVILEGE_SET pPrivSet = NULL;
69 DWORD privSetSize = 0;
70 DWORD attr = GetFileAttributesW(zFilename);
71
72 if( attr==INVALID_FILE_ATTRIBUTES ){
73 /*
74 * File might not exist.
@@ -110,11 +110,10 @@
110
111 /*
112 * First find out how big the buffer needs to be.
113 */
114
 
115 GetFileSecurityW(zFilename,
116 OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION |
117 DACL_SECURITY_INFORMATION | LABEL_SECURITY_INFORMATION,
118 0, 0, &size);
119
@@ -213,16 +212,31 @@
212 memset(&genMap, 0, sizeof(GENERIC_MAPPING));
213 genMap.GenericRead = FILE_GENERIC_READ;
214 genMap.GenericWrite = FILE_GENERIC_WRITE;
215 genMap.GenericExecute = FILE_GENERIC_EXECUTE;
216 genMap.GenericAll = FILE_ALL_ACCESS;
217
218 AccessCheck(pSd, hToken, desiredAccess, &genMap, 0,
219 &privSetSize, &grantedAccess, &accessYesNo);
220 /*
221 * Should have failed with ERROR_INSUFFICIENT_BUFFER
222 */
223
224 if( GetLastError()!=ERROR_INSUFFICIENT_BUFFER ){
225 rc = -1; goto done;
226 }
227 pPrivSet = (PPRIVILEGE_SET)HeapAlloc(GetProcessHeap(), 0, privSetSize);
228
229 if( pPrivSet==NULL ){
230 rc = -1; goto done;
231 }
232
233 /*
234 * Perform access check using the token.
235 */
236
237 if( !AccessCheck(pSd, hToken, desiredAccess, &genMap, pPrivSet,
238 &privSetSize, &grantedAccess, &accessYesNo) ){
239 /*
240 * Unable to perform access check.
241 */
242
@@ -237,10 +251,13 @@
251 }
252 if( impersonated ){
253 RevertToSelf();
254 impersonated = FALSE;
255 }
256 if( pPrivSet!=NULL ){
257 HeapFree(GetProcessHeap(), 0, pPrivSet);
258 }
259 if( pSd!=NULL ){
260 HeapFree(GetProcessHeap(), 0, pSd);
261 }
262 return rc;
263 }
264

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button