From cc7c9e886f35b7b93eb4206f33991c7cddc8cef6 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Mon, 15 Jan 2007 19:52:19 +0000 Subject: [PATCH] DEVEL15-windows-open-dir-lookup-20070115 add new error code when requested InfoLevel is not supported CIFS NTCreateX Read privilege means PRSFS_LOOKUP when the object is a directory (cherry picked from commit 20f426568625f40b37973121805f0ac820b9017c) --- src/WINNT/afsd/cm.h | 1 + src/WINNT/afsd/cm_vnodeops.c | 2 +- src/WINNT/afsd/smb.c | 9 ++++++--- src/WINNT/afsd/smb.h | 2 +- src/WINNT/afsd/smb3.c | 20 ++++++++++---------- 5 files changed, 19 insertions(+), 15 deletions(-) diff --git a/src/WINNT/afsd/cm.h b/src/WINNT/afsd/cm.h index cbdd16914..e5c1d081f 100644 --- a/src/WINNT/afsd/cm.h +++ b/src/WINNT/afsd/cm.h @@ -299,4 +299,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__ */ diff --git a/src/WINNT/afsd/cm_vnodeops.c b/src/WINNT/afsd/cm_vnodeops.c index 987954ffc..48255320d 100644 --- a/src/WINNT/afsd/cm_vnodeops.c +++ b/src/WINNT/afsd/cm_vnodeops.c @@ -351,7 +351,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) diff --git a/src/WINNT/afsd/smb.c b/src/WINNT/afsd/smb.c index 06992d842..9eb52de62 100644 --- a/src/WINNT/afsd/smb.c +++ b/src/WINNT/afsd/smb.c @@ -2844,6 +2844,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 */ } @@ -5108,11 +5111,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); @@ -7369,7 +7372,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) diff --git a/src/WINNT/afsd/smb.h b/src/WINNT/afsd/smb.h index 55482c1e8..d86e129aa 100644 --- a/src/WINNT/afsd/smb.h +++ b/src/WINNT/afsd/smb.h @@ -383,7 +383,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 diff --git a/src/WINNT/afsd/smb3.c b/src/WINNT/afsd/smb3.c index c4d2b2802..82410b902 100644 --- a/src/WINNT/afsd/smb3.c +++ b/src/WINNT/afsd/smb3.c @@ -2375,7 +2375,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; @@ -2436,7 +2436,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) @@ -2675,7 +2675,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; } @@ -2957,7 +2957,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; } @@ -3190,7 +3190,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; } @@ -3311,7 +3311,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; } @@ -5582,7 +5582,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; @@ -6526,7 +6526,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) @@ -7303,7 +7303,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) @@ -8352,7 +8352,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; } -- 2.39.5