]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
windows-symlink-access-20041003
authorJeffrey Altman <jaltman@mit.edu>
Sun, 3 Oct 2004 14:53:35 +0000 (14:53 +0000)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Sun, 3 Oct 2004 14:53:35 +0000 (14:53 +0000)
FIXES 15250

One more fix for the symlink problem.  Access control checks cannot be
performed until after we have walked all of the symlinks.  Otherwise,
we are checking access to the symlink itself and not to the file.

src/WINNT/afsd/smb3.c

index b70ae2bff04e7445cb5f51a3e894105596dfd3f0..4e56d167d90c8a63ed65f4fa6f0cd93e360f3837 100644 (file)
@@ -5071,16 +5071,6 @@ long smb_ReceiveNTCreateX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp)
         * scp is NULL.
         */
        if (code == 0 && !treeCreate) {
-            code = cm_CheckNTOpen(scp, desiredAccess, createDisp, userp,
-                                  &req);
-            if (code) {
-                if (dscp) cm_ReleaseSCache(dscp);
-                cm_ReleaseSCache(scp);
-                cm_ReleaseUser(userp);
-                free(realPathp);
-                return code;
-            }
-
             if (createDisp == FILE_CREATE) {
                 /* oops, file shouldn't be there */
                 if (dscp) cm_ReleaseSCache(dscp);
@@ -5114,7 +5104,18 @@ long smb_ReceiveNTCreateX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp)
                 code = cm_SetAttr(scp, &setAttr, userp, &req);
                 openAction = 3;        /* truncated existing file */
             }
-            else openAction = 1;       /* found existing file */
+            else 
+                               openAction = 1; /* found existing file */
+
+                       code = cm_CheckNTOpen(scp, desiredAccess, createDisp, userp,
+                                  &req);
+            if (code) {
+                if (dscp) cm_ReleaseSCache(dscp);
+                cm_ReleaseSCache(scp);
+                cm_ReleaseUser(userp);
+                free(realPathp);
+                return code;
+            }
        }       
        else if (createDisp == FILE_OPEN || createDisp == FILE_OVERWRITE) {
             /* don't create if not found */