From: Jeffrey Altman Date: Sat, 12 Nov 2011 23:33:18 +0000 (-0500) Subject: Windows: smb_ReceiveNTCreateX create smb_fid earlier X-Git-Tag: upstream/1.6.1.pre4^2~35 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=2c9be3970bbb8ce83904c9db29045ff01942eae2;p=packages%2Fo%2Fopenafs.git Windows: smb_ReceiveNTCreateX create smb_fid earlier smb_ReceiveNTCreateX() calls cm_CheckNTOpen() which now requires the smb_fid_t allocated fid value for use in share mode locking. Move the allocation of the smb_fid earlier in the function and apply necessary cleanup in error paths. Reviewed-on: http://gerrit.openafs.org/6004 Tested-by: BuildBot Reviewed-by: Jeffrey Altman Tested-by: Jeffrey Altman (cherry picked from commit 38fbf93fcc21aaecbf9a7e27d19131b9de4c3839) Change-Id: I9399d8f16ee236b4724a0ec825fca1ce72f363ce Reviewed-on: http://gerrit.openafs.org/6806 Tested-by: BuildBot Reviewed-by: Derrick Brashear --- diff --git a/src/WINNT/afsd/smb3.c b/src/WINNT/afsd/smb3.c index 0ddbc77eb..4d229e3b7 100644 --- a/src/WINNT/afsd/smb3.c +++ b/src/WINNT/afsd/smb3.c @@ -7821,6 +7821,18 @@ long smb_ReceiveNTCreateX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) * by dscp, or we may have found the file directly. If code is non-zero, * scp is NULL. */ + + /* + * open the file itself + * allocate the fidp early so the smb fid can be used by cm_CheckNTOpen() + */ + fidp = smb_FindFID(vcp, 0, SMB_FLAG_CREATE); + osi_assertx(fidp, "null smb_fid_t"); + + /* save a reference to the user */ + cm_HoldUser(userp); + fidp->userp = userp; + if (code == 0 && !treeCreate) { code = cm_CheckNTOpen(scp, desiredAccess, createDisp, userp, &req, &ldp); if (code) { @@ -7830,6 +7842,8 @@ long smb_ReceiveNTCreateX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) if (scp) cm_ReleaseSCache(scp); cm_ReleaseUser(userp); + smb_CloseFID(vcp, fidp, NULL, 0); + smb_ReleaseFID(fidp); free(realPathp); return code; } @@ -7843,6 +7857,8 @@ long smb_ReceiveNTCreateX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) if (scp) cm_ReleaseSCache(scp); cm_ReleaseUser(userp); + smb_CloseFID(vcp, fidp, NULL, 0); + smb_ReleaseFID(fidp); free(realPathp); return CM_ERROR_EXISTS; } @@ -7877,6 +7893,8 @@ long smb_ReceiveNTCreateX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) if (scp) cm_ReleaseSCache(scp); cm_ReleaseUser(userp); + smb_CloseFID(vcp, fidp, NULL, 0); + smb_ReleaseFID(fidp); free(realPathp); return code; } @@ -7895,6 +7913,8 @@ long smb_ReceiveNTCreateX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) if (scp) cm_ReleaseSCache(scp); cm_ReleaseUser(userp); + smb_CloseFID(vcp, fidp, NULL, 0); + smb_ReleaseFID(fidp); free(realPathp); return CM_ERROR_NOSUCHFILE; } else if (realDirFlag == 0 || realDirFlag == -1) { @@ -8046,6 +8066,8 @@ long smb_ReceiveNTCreateX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) if (dscp) cm_ReleaseSCache(dscp); cm_ReleaseUser(userp); + smb_CloseFID(vcp, fidp, NULL, 0); + smb_ReleaseFID(fidp); free(realPathp); return code; } @@ -8079,6 +8101,8 @@ long smb_ReceiveNTCreateX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) cm_ReleaseSCache(dscp); cm_ReleaseSCache(scp); cm_ReleaseUser(userp); + smb_CloseFID(vcp, fidp, NULL, 0); + smb_ReleaseFID(fidp); free(realPathp); return CM_ERROR_ISDIR; } @@ -8092,18 +8116,12 @@ long smb_ReceiveNTCreateX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) if (dscp) cm_ReleaseSCache(dscp); cm_ReleaseUser(userp); + smb_CloseFID(vcp, fidp, NULL, 0); + smb_ReleaseFID(fidp); free(realPathp); return CM_ERROR_NOTDIR; } - /* open the file itself */ - fidp = smb_FindFID(vcp, 0, SMB_FLAG_CREATE); - osi_assertx(fidp, "null smb_fid_t"); - - /* save a reference to the user */ - cm_HoldUser(userp); - fidp->userp = userp; - /* If we are restricting sharing, we should do so with a suitable share lock. */ if (scp->fileType == CM_SCACHETYPE_FILE && @@ -8141,7 +8159,6 @@ long smb_ReceiveNTCreateX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) if (dscp) cm_ReleaseSCache(dscp); cm_ReleaseUser(userp); - /* Shouldn't this be smb_CloseFID()? fidp->flags = SMB_FID_DELETE; */ smb_CloseFID(vcp, fidp, NULL, 0); smb_ReleaseFID(fidp); free(realPathp);