From a88d12746a9e7e8e79a80c5bcafda449810b4e22 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Sun, 24 Aug 2008 22:45:24 +0000 Subject: [PATCH] windows-smb-more-check-open-done-20080824 LICENSE MIT call cm_CheckNTOpenDone() in error conditions as well --- src/WINNT/afsd/smb3.c | 40 ++++++++++++++++++++++++++++------------ 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/src/WINNT/afsd/smb3.c b/src/WINNT/afsd/smb3.c index ba54a818c..abc4474f4 100644 --- a/src/WINNT/afsd/smb3.c +++ b/src/WINNT/afsd/smb3.c @@ -6689,6 +6689,7 @@ long smb_ReceiveNTCreateX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) cm_req_t req; int created = 0; int prefetch = 0; + int checkDoneRequired = 0; cm_lock_data_t *ldp = NULL; smb_InitReq(&req); @@ -7081,6 +7082,7 @@ long smb_ReceiveNTCreateX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) if (code == 0 && !treeCreate) { code = cm_CheckNTOpen(scp, desiredAccess, createDisp, userp, &req, &ldp); if (code) { + cm_CheckNTOpenDone(scp, userp, &req, &ldp); if (dscp) cm_ReleaseSCache(dscp); if (scp) @@ -7089,6 +7091,7 @@ long smb_ReceiveNTCreateX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) free(realPathp); return code; } + checkDoneRequired = 1; if (createDisp == FILE_CREATE) { /* oops, file shouldn't be there */ @@ -7126,6 +7129,7 @@ long smb_ReceiveNTCreateX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) scp = targetScp; code = cm_CheckNTOpen(scp, desiredAccess, createDisp, userp, &req, &ldp); if (code) { + cm_CheckNTOpenDone(scp, userp, &req, &ldp); if (dscp) cm_ReleaseSCache(dscp); if (scp) @@ -7290,7 +7294,7 @@ long smb_ReceiveNTCreateX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) if (code) { /* something went wrong creating or truncating the file */ - if (ldp) + if (checkDoneRequired) cm_CheckNTOpenDone(scp, userp, &req, &ldp); if (scp) cm_ReleaseSCache(scp); @@ -7314,15 +7318,17 @@ long smb_ReceiveNTCreateX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) * we'll just use the symlink anyway. */ osi_Log2(smb_logp, "symlink vp %x to vp %x", scp, targetScp); - if (ldp) + if (checkDoneRequired) { cm_CheckNTOpenDone(scp, userp, &req, &ldp); + checkDoneRequired = 0; + } cm_ReleaseSCache(scp); scp = targetScp; } } if (scp->fileType != CM_SCACHETYPE_FILE) { - if (ldp) + if (checkDoneRequired) cm_CheckNTOpenDone(scp, userp, &req, &ldp); if (dscp) cm_ReleaseSCache(dscp); @@ -7335,7 +7341,7 @@ long smb_ReceiveNTCreateX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) /* (only applies to single component case) */ if (realDirFlag == 1 && scp->fileType == CM_SCACHETYPE_FILE) { - if (ldp) + if (checkDoneRequired) cm_CheckNTOpenDone(scp, userp, &req, &ldp); cm_ReleaseSCache(scp); if (dscp) @@ -7384,7 +7390,7 @@ long smb_ReceiveNTCreateX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) lock_ReleaseWrite(&scp->rw); if (code) { - if (ldp) + if (checkDoneRequired) cm_CheckNTOpenDone(scp, userp, &req, &ldp); cm_ReleaseSCache(scp); if (dscp) @@ -7399,8 +7405,10 @@ long smb_ReceiveNTCreateX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) } /* Now its safe to release the file server lock obtained by cm_CheckNTOpen() */ - if (ldp) + if (checkDoneRequired) { cm_CheckNTOpenDone(scp, userp, &req, &ldp); + checkDoneRequired = 0; + } lock_ObtainMutex(&fidp->mx); /* save a pointer to the vnode */ @@ -7540,6 +7548,7 @@ long smb_ReceiveNTTranCreate(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *out int created = 0; int prefetch = 0; cm_lock_data_t *ldp = NULL; + int checkDoneRequired = 0; smb_InitReq(&req); @@ -7824,6 +7833,7 @@ long smb_ReceiveNTTranCreate(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *out if (code == 0) { code = cm_CheckNTOpen(scp, desiredAccess, createDisp, userp, &req, &ldp); if (code) { + cm_CheckNTOpenDone(scp, userp, &req, &ldp); if (dscp) cm_ReleaseSCache(dscp); cm_ReleaseSCache(scp); @@ -7831,6 +7841,7 @@ long smb_ReceiveNTTranCreate(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *out free(realPathp); return code; } + checkDoneRequired = 1; if (createDisp == FILE_CREATE) { /* oops, file shouldn't be there */ @@ -7866,6 +7877,7 @@ long smb_ReceiveNTTranCreate(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *out scp = targetScp; code = cm_CheckNTOpen(scp, desiredAccess, createDisp, userp, &req, &ldp); if (code) { + cm_CheckNTOpenDone(scp, userp, &req, &ldp); if (dscp) cm_ReleaseSCache(dscp); if (scp) @@ -7968,7 +7980,7 @@ long smb_ReceiveNTTranCreate(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *out if (code) { /* something went wrong creating or truncating the file */ - if (ldp) + if (checkDoneRequired) cm_CheckNTOpenDone(scp, userp, &req, &ldp); if (scp) cm_ReleaseSCache(scp); @@ -7991,15 +8003,17 @@ long smb_ReceiveNTTranCreate(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *out */ osi_Log2(smb_logp, "symlink vp %x to vp %x", scp, targetScp); - if (ldp) + if (checkDoneRequired) { cm_CheckNTOpenDone(scp, userp, &req, &ldp); + checkDoneRequired = 0; + } cm_ReleaseSCache(scp); scp = targetScp; } } if (scp->fileType != CM_SCACHETYPE_FILE) { - if (ldp) + if (checkDoneRequired) cm_CheckNTOpenDone(scp, userp, &req, &ldp); cm_ReleaseSCache(scp); cm_ReleaseUser(userp); @@ -8009,7 +8023,7 @@ long smb_ReceiveNTTranCreate(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *out } if (realDirFlag == 1 && scp->fileType == CM_SCACHETYPE_FILE) { - if (ldp) + if (checkDoneRequired) cm_CheckNTOpenDone(scp, userp, &req, &ldp); cm_ReleaseSCache(scp); cm_ReleaseUser(userp); @@ -8054,7 +8068,7 @@ long smb_ReceiveNTTranCreate(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *out lock_ReleaseWrite(&scp->rw); if (code) { - if (ldp) + if (checkDoneRequired) cm_CheckNTOpenDone(scp, userp, &req, &ldp); cm_ReleaseSCache(scp); cm_ReleaseUser(userp); @@ -8067,8 +8081,10 @@ long smb_ReceiveNTTranCreate(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *out } /* Now its safe to drop the file server lock obtained by cm_CheckNTOpen() */ - if (ldp) + if (checkDoneRequired) { cm_CheckNTOpenDone(scp, userp, &req, &ldp); + checkDoneRequired = 0; + } lock_ObtainMutex(&fidp->mx); /* save a pointer to the vnode */ -- 2.39.5