]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
windows-open-dir-lookup-20070115
authorJeffrey Altman <jaltman@secure-endpoints.com>
Mon, 15 Jan 2007 19:50:51 +0000 (19:50 +0000)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Mon, 15 Jan 2007 19:50:51 +0000 (19:50 +0000)
add new error code when requested InfoLevel is not supported

CIFS NTCreateX Read privilege means PRSFS_LOOKUP when the object is a
directory

src/WINNT/afsd/cm.h
src/WINNT/afsd/cm_vnodeops.c
src/WINNT/afsd/smb.c
src/WINNT/afsd/smb.h
src/WINNT/afsd/smb3.c

index d4832fc84d59fc8f87e52ba5d7203bbc2e1abe4f..20cf55416b29ad5de1b05eb21d1eee7bf9980f9e 100644 (file)
@@ -295,4 +295,5 @@ int RXAFS_Lookup (struct rx_connection *,
 #define CM_ERROR_ALLDOWN                (CM_ERROR_BASE+49)
 #define CM_ERROR_TOOFEWBUFS            (CM_ERROR_BASE+50)
 #define CM_ERROR_TOOMANYBUFS           (CM_ERROR_BASE+51)
+#define CM_ERROR_BAD_LEVEL             (CM_ERROR_BASE+52)
 #endif /*  __CM_H_ENV__ */
index d302fe593d21da93442e0fe06472478b2b215701..4d1ba03a1e354101009050d09792485011e73caa 100644 (file)
@@ -349,7 +349,7 @@ long cm_CheckNTOpen(cm_scache_t *scp, unsigned int desiredAccess,
     rights = 0;
 
     if (desiredAccess & AFS_ACCESS_READ)
-        rights |= PRSFS_READ;
+        rights |= (scp->fileType == CM_SCACHETYPE_DIRECTORY ? PRSFS_LOOKUP : PRSFS_READ);
 
     if ((desiredAccess & AFS_ACCESS_WRITE)
          || createDisp == 4)
index 71f327fe1dbbbe4b2b28b839a224d6822f37a9da..7ec68ad2e60b61345bdb2a47bfe790975f151ae4 100644 (file)
@@ -2598,6 +2598,9 @@ void smb_MapNTError(long code, unsigned long *NTStatusp)
 #endif
     else if (code == RXKADUNKNOWNKEY) {
        NTStatus = 0xC0000322L; /* Bad Kerberos key */
+    } 
+    else if (code == CM_ERROR_BAD_LEVEL) {
+       NTStatus = 0xC0000148L; /* Invalid Level */
     } else {
         NTStatus = 0xC0982001L;        /* SMB non-specific error */
     }
@@ -4828,11 +4831,11 @@ long smb_ReceiveCoreOpen(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp)
 
     lock_ObtainMutex(&fidp->mx);
     if ((share & 0xf) == 0)
-        fidp->flags |= SMB_FID_OPENREAD;
+        fidp->flags |= SMB_FID_OPENREAD_LISTDIR;
     else if ((share & 0xf) == 1)
         fidp->flags |= SMB_FID_OPENWRITE;
     else 
-        fidp->flags |= (SMB_FID_OPENREAD | SMB_FID_OPENWRITE);
+        fidp->flags |= (SMB_FID_OPENREAD_LISTDIR | SMB_FID_OPENWRITE);
     lock_ReleaseMutex(&fidp->mx);
 
     lock_ObtainMutex(&scp->mx);
@@ -7032,7 +7035,7 @@ long smb_ReceiveCoreCreate(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp)
 
     lock_ObtainMutex(&fidp->mx);
     /* always create it open for read/write */
-    fidp->flags |= (SMB_FID_OPENREAD | SMB_FID_OPENWRITE);
+    fidp->flags |= (SMB_FID_OPENREAD_LISTDIR | SMB_FID_OPENWRITE);
 
     /* remember that the file was newly created */
     if (created)
index 352169be94507efb9319427ee2bf0e3f49357191..0ea432f69b4dd540dee4af1e36c854318cdc01e8 100644 (file)
@@ -370,7 +370,7 @@ typedef struct smb_fid {
     afs_uint32 delete;                 /* ok to del: locked by smb_rctLock */
 } smb_fid_t;
 
-#define SMB_FID_OPENREAD               1       /* open for reading */
+#define SMB_FID_OPENREAD_LISTDIR       1       /* open for reading / listing directory */
 #define SMB_FID_OPENWRITE              2       /* open for writing */
 #define SMB_FID_CREATED                 4       /* a new file */
 #define SMB_FID_IOCTL                  8       /* a file descriptor for the
index 09b63b2e2ed51ae7f7bc568a28052ce36e9f588a..83cd3366b08ceb28f4abb5e22d2bb5d6ac6e1479 100644 (file)
@@ -2369,7 +2369,7 @@ long smb_ReceiveTran2Open(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t *op)
         
     /* compute open mode */
     if (openMode != 1) 
-       fidp->flags |= SMB_FID_OPENREAD;
+       fidp->flags |= SMB_FID_OPENREAD_LISTDIR;
     if (openMode == 1 || openMode == 2)
         fidp->flags |= SMB_FID_OPENWRITE;
 
@@ -2430,7 +2430,7 @@ long smb_ReceiveTran2QFSInfoFid(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_
     fid = p->parmsp[1];
     osi_Log2(smb_logp, "T2 QFSInfoFid InfoLevel 0x%x fid 0x%x - NOT_SUPPORTED", infolevel, fid);
     
-    return CM_ERROR_BADOP;
+    return CM_ERROR_BAD_LEVEL;
 }
 
 long smb_ReceiveTran2QFSInfo(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t *op)
@@ -2669,7 +2669,7 @@ long smb_ReceiveTran2QPathInfo(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t
     else {
         osi_Log2(smb_logp, "Bad Tran2 op 0x%x infolevel 0x%x",
                   p->opcode, infoLevel);
-        smb_SendTran2Error(vcp, p, opx, CM_ERROR_BADOP);
+        smb_SendTran2Error(vcp, p, opx, CM_ERROR_BAD_LEVEL);
         return 0;
     }
 
@@ -2951,7 +2951,7 @@ long smb_ReceiveTran2SetPathInfo(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet
        infoLevel != SMB_INFO_QUERY_ALL_EAS) {
         osi_Log2(smb_logp, "Bad Tran2 op 0x%x infolevel 0x%x",
                   p->opcode, infoLevel);
-        smb_SendTran2Error(vcp, p, opx, CM_ERROR_INVAL);
+        smb_SendTran2Error(vcp, p, opx, CM_ERROR_BAD_LEVEL);
         return 0;
     }
 
@@ -3184,7 +3184,7 @@ long smb_ReceiveTran2QFileInfo(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t
     else {
         osi_Log2(smb_logp, "Bad Tran2 op 0x%x infolevel 0x%x",
                   p->opcode, infoLevel);
-        smb_SendTran2Error(vcp, p, opx, CM_ERROR_BADOP);
+        smb_SendTran2Error(vcp, p, opx, CM_ERROR_BAD_LEVEL);
         smb_ReleaseFID(fidp);
         return 0;
     }
@@ -3305,7 +3305,7 @@ long smb_ReceiveTran2SetFileInfo(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet
     if (infoLevel > SMB_SET_FILE_END_OF_FILE_INFO || infoLevel < SMB_SET_FILE_BASIC_INFO) {
         osi_Log2(smb_logp, "Bad Tran2 op 0x%x infolevel 0x%x",
                   p->opcode, infoLevel);
-        smb_SendTran2Error(vcp, p, opx, CM_ERROR_BADOP);
+        smb_SendTran2Error(vcp, p, opx, CM_ERROR_BAD_LEVEL);
         smb_ReleaseFID(fidp);
         return 0;
     }
@@ -5576,7 +5576,7 @@ long smb_ReceiveV3OpenX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp)
         
     /* compute open mode */
     if (openMode != 1) 
-        fidp->flags |= SMB_FID_OPENREAD;
+        fidp->flags |= SMB_FID_OPENREAD_LISTDIR;
     if (openMode == 1 || openMode == 2)
         fidp->flags |= SMB_FID_OPENWRITE;
 
@@ -6512,7 +6512,7 @@ long smb_ReceiveNTCreateX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp)
     if (desiredAccess & DELETE)
         fidflags |= SMB_FID_OPENDELETE;
     if (desiredAccess & AFS_ACCESS_READ)
-        fidflags |= SMB_FID_OPENREAD;
+        fidflags |= SMB_FID_OPENREAD_LISTDIR;
     if (desiredAccess & AFS_ACCESS_WRITE)
         fidflags |= SMB_FID_OPENWRITE;
     if (createOptions & FILE_DELETE_ON_CLOSE)
@@ -7289,7 +7289,7 @@ long smb_ReceiveNTTranCreate(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *out
     if (desiredAccess & DELETE)
         fidflags |= SMB_FID_OPENDELETE;
     if (desiredAccess & AFS_ACCESS_READ)
-        fidflags |= SMB_FID_OPENREAD;
+        fidflags |= SMB_FID_OPENREAD_LISTDIR;
     if (desiredAccess & AFS_ACCESS_WRITE)
         fidflags |= SMB_FID_OPENWRITE;
     if (createOptions & FILE_DELETE_ON_CLOSE)
@@ -8338,7 +8338,7 @@ long smb_ReceiveNTRename(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp)
     rename_type = smb_GetSMBParm(inp, 1);
 
     if (rename_type != RENAME_FLAG_RENAME && rename_type != RENAME_FLAG_HARD_LINK) {
-        osi_Log1(smb_logp, "NTRename invalid infolevel [%x]", rename_type);
+        osi_Log1(smb_logp, "NTRename invalid rename_type [%x]", rename_type);
         return CM_ERROR_NOACCESS;
     }