afs_int32 mustFake = 0;
clientchar_t path[AFSPATHMAX];
+ lock_ObtainWrite(&dscp->rw);
code = cm_FindACLCache(dscp, userp, &rights);
if (code == -1) {
- lock_ObtainWrite(&dscp->rw);
code = cm_SyncOp(dscp, NULL, userp, reqp, PRSFS_READ,
CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
if (code == 0)
cm_SyncOpDone(dscp, NULL, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
- lock_ReleaseWrite(&dscp->rw);
if (code == CM_ERROR_NOACCESS) {
mustFake = 1;
code = 0;
}
}
+ lock_ReleaseWrite(&dscp->rw);
if (code)
goto cleanup;
if (patchp->flags & SMB_DIRLISTPATCH_IOCTL)
continue;
- code = cm_GetSCache(&patchp->fid, &tscp, userp, reqp);
+ code = cm_GetSCache(&patchp->fid, &dscp->fid, &tscp, userp, reqp);
if (code == 0) {
if (lock_TryWrite(&tscp->rw)) {
/* we have an entry that we can look at */
continue;
}
- code = cm_GetSCache(&patchp->fid, &scp, userp, reqp);
+ code = cm_GetSCache(&patchp->fid, &dscp->fid, &scp, userp, reqp);
reqp->relPathp = reqp->tidPathp = NULL;
if (code)
continue;
* 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);
+ code = cm_CheckNTOpen(scp, desiredAccess, shareAccess, createDisp, 0, fidp->fid, userp, &req, &ldp);
if (code) {
cm_CheckNTOpenDone(scp, userp, &req, &ldp);
if (dscp)
if (scp)
cm_ReleaseSCache(scp);
cm_ReleaseUser(userp);
+ smb_CloseFID(vcp, fidp, NULL, 0);
+ smb_ReleaseFID(fidp);
free(realPathp);
return code;
}
if (scp)
cm_ReleaseSCache(scp);
cm_ReleaseUser(userp);
+ smb_CloseFID(vcp, fidp, NULL, 0);
+ smb_ReleaseFID(fidp);
free(realPathp);
return CM_ERROR_EXISTS;
}
cm_CheckNTOpenDone(scp, userp, &req, &ldp);
cm_ReleaseSCache(scp);
scp = targetScp;
- code = cm_CheckNTOpen(scp, desiredAccess, createDisp, userp, &req, &ldp);
+ code = cm_CheckNTOpen(scp, desiredAccess, shareAccess, createDisp, 0, fidp->fid, userp, &req, &ldp);
if (code) {
cm_CheckNTOpenDone(scp, userp, &req, &ldp);
if (dscp)
if (scp)
cm_ReleaseSCache(scp);
cm_ReleaseUser(userp);
+ smb_CloseFID(vcp, fidp, NULL, 0);
+ smb_ReleaseFID(fidp);
free(realPathp);
return code;
}
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) {
if (dscp)
cm_ReleaseSCache(dscp);
cm_ReleaseUser(userp);
+ smb_CloseFID(vcp, fidp, NULL, 0);
+ smb_ReleaseFID(fidp);
free(realPathp);
return code;
}
cm_ReleaseSCache(dscp);
cm_ReleaseSCache(scp);
cm_ReleaseUser(userp);
+ smb_CloseFID(vcp, fidp, NULL, 0);
+ smb_ReleaseFID(fidp);
free(realPathp);
return CM_ERROR_ISDIR;
}
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 &&
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);
* scp is NULL.
*/
if (code == 0) {
- code = cm_CheckNTOpen(scp, desiredAccess, createDisp, userp, &req, &ldp);
+ code = cm_CheckNTOpen(scp, desiredAccess, shareAccess, createDisp, 0, fidp->fid, userp, &req, &ldp);
if (code) {
cm_CheckNTOpenDone(scp, userp, &req, &ldp);
cm_ReleaseSCache(dscp);
cm_CheckNTOpenDone(scp, userp, &req, &ldp);
cm_ReleaseSCache(scp);
scp = targetScp;
- code = cm_CheckNTOpen(scp, desiredAccess, createDisp, userp, &req, &ldp);
+ code = cm_CheckNTOpen(scp, desiredAccess, shareAccess, createDisp, 0, fidp->fid, userp, &req, &ldp);
if (code) {
cm_CheckNTOpenDone(scp, userp, &req, &ldp);
cm_ReleaseSCache(dscp);