From 20f426568625f40b37973121805f0ac820b9017c Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Mon, 15 Jan 2007 19:50:51 +0000 Subject: [PATCH] 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 --- 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 d4832fc84..20cf55416 100644 --- a/src/WINNT/afsd/cm.h +++ b/src/WINNT/afsd/cm.h @@ -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__ */ diff --git a/src/WINNT/afsd/cm_vnodeops.c b/src/WINNT/afsd/cm_vnodeops.c index d302fe593..4d1ba03a1 100644 --- a/src/WINNT/afsd/cm_vnodeops.c +++ b/src/WINNT/afsd/cm_vnodeops.c @@ -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) diff --git a/src/WINNT/afsd/smb.c b/src/WINNT/afsd/smb.c index 71f327fe1..7ec68ad2e 100644 --- a/src/WINNT/afsd/smb.c +++ b/src/WINNT/afsd/smb.c @@ -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) diff --git a/src/WINNT/afsd/smb.h b/src/WINNT/afsd/smb.h index 352169be9..0ea432f69 100644 --- a/src/WINNT/afsd/smb.h +++ b/src/WINNT/afsd/smb.h @@ -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 diff --git a/src/WINNT/afsd/smb3.c b/src/WINNT/afsd/smb3.c index 09b63b2e2..83cd3366b 100644 --- a/src/WINNT/afsd/smb3.c +++ b/src/WINNT/afsd/smb3.c @@ -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; } -- 2.39.5