From: Jeffrey Altman Date: Sat, 31 Jul 2010 04:21:06 +0000 (-0400) Subject: Windows: Do not reference cm_data.rootSCachep directly X-Git-Tag: openafs-devel-1_5_76~53 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=89afd3c21e816c29f497c10cf76673d009cdd919;p=packages%2Fo%2Fopenafs.git Windows: Do not reference cm_data.rootSCachep directly cm_data.rootSCachep is a global pointer to the cm_scache_t that represents the root.afs volume root directory. Throughout the code this cm_scache_t was being used without ensuring that a callback to the volume is in fact valid. Under most circumstances this would not be a problem. However, it is possible for a request to fail due to the lack of a callback at a critical moment. Add a new function cm_rootScachep() that attempts to ensure that a callback is present (if possible) prior to use the cm_scache_t object. LICENSE MIT Change-Id: I997dc05a2214788d32727c261947206a61cd8d32 Reviewed-on: http://gerrit.openafs.org/2491 Reviewed-by: Jeffrey Altman Tested-by: Jeffrey Altman --- diff --git a/src/WINNT/afsd/cm_freelance.c b/src/WINNT/afsd/cm_freelance.c index 286887847..8cbb594e7 100644 --- a/src/WINNT/afsd/cm_freelance.c +++ b/src/WINNT/afsd/cm_freelance.c @@ -1137,7 +1137,7 @@ long cm_FreelanceAddMount(char *filename, char *cellname, char *volume, int rw, cm_reInitLocalMountPoints(); // start reinit } - code = cm_NameI(cm_data.rootSCachep, cpath, + code = cm_NameI(cm_RootSCachep(cm_rootUserp, &req), cpath, CM_FLAG_FOLLOW | CM_FLAG_CASEFOLD | CM_FLAG_DFS_REFERRAL, cm_rootUserp, NULL, &req, &scp); free(cpath); @@ -1381,7 +1381,7 @@ long cm_FreelanceAddSymlink(char *filename, char *destination, cm_fid_t *fidp) cm_reInitLocalMountPoints(); // start reinit } - code = cm_NameI(cm_data.rootSCachep, cpath, + code = cm_NameI(cm_RootSCachep(cm_rootUserp, &req), cpath, CM_FLAG_FOLLOW | CM_FLAG_CASEFOLD | CM_FLAG_DFS_REFERRAL, cm_rootUserp, NULL, &req, &scp); free(cpath); diff --git a/src/WINNT/afsd/cm_scache.c b/src/WINNT/afsd/cm_scache.c index 5501d852d..9a68fdb26 100644 --- a/src/WINNT/afsd/cm_scache.c +++ b/src/WINNT/afsd/cm_scache.c @@ -42,6 +42,22 @@ osi_queue_t * cm_allFreeWaiters; /* protected by cm_scacheLock */ extern osi_mutex_t cm_Freelance_Lock; #endif +cm_scache_t * +cm_RootSCachep(cm_user_t *userp, cm_req_t *reqp) +{ + afs_int32 code; + + lock_ObtainWrite(&cm_data.rootSCachep->rw); + code = cm_SyncOp(cm_data.rootSCachep, NULL, userp, reqp, 0, + CM_SCACHESYNC_GETSTATUS | CM_SCACHESYNC_NEEDCALLBACK); + if (!code) + cm_SyncOpDone(cm_data.rootSCachep, NULL, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS); + lock_ReleaseWrite(&cm_data.rootSCachep->rw); + + return cm_data.rootSCachep; +} + + /* must be called with cm_scacheLock write-locked! */ void cm_AdjustScacheLRU(cm_scache_t *scp) { diff --git a/src/WINNT/afsd/cm_scache.h b/src/WINNT/afsd/cm_scache.h index 2da484b3b..b32a1e9cd 100644 --- a/src/WINNT/afsd/cm_scache.h +++ b/src/WINNT/afsd/cm_scache.h @@ -429,4 +429,6 @@ extern void cm_AdjustScacheLRU(cm_scache_t *scp); extern int cm_DumpSCache(FILE *outputFile, char *cookie, int lock); extern void cm_ResetSCacheDirectory(cm_scache_t *scp, afs_int32 locked); + +extern cm_scache_t * cm_RootSCachep(cm_user_t *userp, cm_req_t *reqp); #endif /* __CM_SCACHE_H_ENV__ */ diff --git a/src/WINNT/afsd/cm_vnodeops.c b/src/WINNT/afsd/cm_vnodeops.c index bc2628df2..562500032 100644 --- a/src/WINNT/afsd/cm_vnodeops.c +++ b/src/WINNT/afsd/cm_vnodeops.c @@ -1813,8 +1813,8 @@ long cm_AssembleLink(cm_scache_t *linkScp, fschar_t *pathSuffixp, StringCbCopyA((char *) tsp->data, sizeof(tsp->data), linkp+cm_mountRootLen+1); else tsp->data[0] = 0; - *newRootScpp = cm_data.rootSCachep; - cm_HoldSCache(cm_data.rootSCachep); + *newRootScpp = cm_RootSCachep(userp, reqp); + cm_HoldSCache(*newRootScpp); } else if (linkp[0] == '\\' && linkp[1] == '\\') { if (!strnicmp(&linkp[2], cm_NetbiosName, (len = (long)strlen(cm_NetbiosName)))) { @@ -1827,8 +1827,8 @@ long cm_AssembleLink(cm_scache_t *linkScp, fschar_t *pathSuffixp, if (*p == '\\') *p = '/'; } - *newRootScpp = cm_data.rootSCachep; - cm_HoldSCache(cm_data.rootSCachep); + *newRootScpp = cm_RootSCachep(userp, reqp); + cm_HoldSCache(*newRootScpp); } else { linkScp->fileType = CM_SCACHETYPE_DFSLINK; StringCchCopyA(tsp->data,lengthof(tsp->data), linkp); @@ -1845,8 +1845,8 @@ long cm_AssembleLink(cm_scache_t *linkScp, fschar_t *pathSuffixp, * but this seems to create problems. instead, we will just * reject the link */ StringCchCopyA(tsp->data,lengthof(tsp->data), linkp+1); - *newRootScpp = cm_data.rootSCachep; - cm_HoldSCache(cm_data.rootSCachep); + *newRootScpp = cm_RootSCachep(userp, reqp); + cm_HoldSCache(*newRootScpp); #else /* we still copy the link data into the response so that * the user can see what the link points to diff --git a/src/WINNT/afsd/cm_volstat.c b/src/WINNT/afsd/cm_volstat.c index 3336aae43..a02937f71 100644 --- a/src/WINNT/afsd/cm_volstat.c +++ b/src/WINNT/afsd/cm_volstat.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007 Secure Endpoints Inc. + * Copyright (c) 2007-2010 Secure Endpoints Inc. * * All rights reserved. * @@ -332,7 +332,7 @@ cm_VolStatus_Path_To_ID(const char * share, const char * path, afs_uint32 * cell goto done; } - code = cm_NameI(cm_data.rootSCachep, cpath, + code = cm_NameI(cm_RootSCachep(cm_rootUserp, &req), cpath, CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW, cm_rootUserp, cshare, &req, &scp); if (code) @@ -399,7 +399,7 @@ cm_VolStatus_Path_To_DFSlink(const char * share, const char * path, afs_uint32 * goto done; } - code = cm_NameI(cm_data.rootSCachep, cpath, CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW, + code = cm_NameI(cm_RootSCachep(cm_rootUserp, &req), cpath, CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW, cm_rootUserp, cshare, &req, &scp); if (code) goto done; diff --git a/src/WINNT/afsd/rpc_srvsvc.c b/src/WINNT/afsd/rpc_srvsvc.c index c7af0695b..ceacc66a5 100644 --- a/src/WINNT/afsd/rpc_srvsvc.c +++ b/src/WINNT/afsd/rpc_srvsvc.c @@ -455,7 +455,7 @@ NET_API_STATUS NetrShareEnum( { cm_direnum_t *enump = NULL; cm_direnum_entry_t * entryp = NULL; - cm_scache_t * dscp = cm_data.rootSCachep; + cm_scache_t * dscp; cm_user_t *userp = MSRPC_GetCmUser(); cm_req_t req; int stopnow = 0; @@ -470,6 +470,8 @@ NET_API_STATUS NetrShareEnum( cm_InitReq(&req); + dscp = cm_RootSCachep(userp, &req); + RPC_SRVSVC_ShareEnumAgeCheck(); /* We only support one server name so ignore 'ServerName'. */ @@ -711,7 +713,7 @@ NET_API_STATUS NetrShareGetInfo( /* [in] */ DWORD Level, /* [switch_is][out] */ LPSHARE_INFO InfoStruct) { - cm_scache_t * dscp = cm_data.rootSCachep; + cm_scache_t * dscp; cm_scache_t * scp = NULL; cm_user_t *userp = MSRPC_GetCmUser(); cm_req_t req; @@ -726,6 +728,8 @@ NET_API_STATUS NetrShareGetInfo( cm_InitReq(&req); + dscp = cm_RootSCachep(userp, &req); + /* Allocate the memory for the response */ switch (Level) { case 2: diff --git a/src/WINNT/afsd/smb.c b/src/WINNT/afsd/smb.c index bd8fcd212..8261fd709 100644 --- a/src/WINNT/afsd/smb.c +++ b/src/WINNT/afsd/smb.c @@ -1928,6 +1928,8 @@ int smb_FindShare(smb_vc_t *vcp, smb_user_t *uidp, fschar_t ftemp[1024]; clientchar_t * p = shareName; int rw = 0; + cm_scache_t * rscp; + cm_user_t *userp; /* attempt to locate a partial match in root.afs. This is because when using the ANSI RAP calls, the share name is limited to 13 chars @@ -1942,10 +1944,12 @@ int smb_FindShare(smb_vc_t *vcp, smb_user_t *uidp, vrock.match = NULL; vrock.matchType = 0; - cm_HoldSCache(cm_data.rootSCachep); - code = cm_ApplyDir(cm_data.rootSCachep, smb_FindShareProc, &vrock, &thyper, - (uidp? (uidp->unp ? uidp->unp->userp : NULL) : NULL), &req, NULL); - cm_ReleaseSCache(cm_data.rootSCachep); + userp = (uidp? (uidp->unp ? uidp->unp->userp : cm_rootUserp) : cm_rootUserp); + rscp = cm_RootSCachep(userp, &req); + cm_HoldSCache(rscp); + code = cm_ApplyDir(rscp, smb_FindShareProc, &vrock, &thyper, + userp, &req, NULL); + cm_ReleaseSCache(rscp); free(vrock.shareName); vrock.shareName = NULL; @@ -4868,7 +4872,7 @@ long smb_ReceiveCoreSearchDir(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *ou cm_ClientStrCpy(dsp->tidPath, lengthof(dsp->tidPath), tidPathp ? tidPathp : _C("/")); cm_ClientStrCpy(dsp->relPath, lengthof(dsp->relPath), spacep->wdata); - code = cm_NameI(cm_data.rootSCachep, spacep->wdata, + code = cm_NameI(cm_RootSCachep(userp, &req), spacep->wdata, caseFold | CM_FLAG_FOLLOW, userp, tidPathp, &req, &scp); if (code == 0) { #ifdef DFS_SUPPORT @@ -5291,10 +5295,10 @@ long smb_ReceiveCoreCheckPath(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *ou osi_Log1(smb_logp, "SMB receive check path %S", osi_LogSaveClientString(smb_logp, pathp)); - rootScp = cm_data.rootSCachep; - userp = smb_GetUserFromVCP(vcp, inp); + rootScp = cm_RootSCachep(userp, &req); + caseFold = CM_FLAG_CASEFOLD; code = smb_LookupTIDPath(vcp, ((smb_t *)inp)->tid, &tidPathp); @@ -5380,10 +5384,10 @@ long smb_ReceiveCoreSetFileAttributes(smb_vc_t *vcp, smb_packet_t *inp, smb_pack osi_Log2(smb_logp, "SMB receive setfile attributes time %d, attr 0x%x", dosTime, attribute); - rootScp = cm_data.rootSCachep; - userp = smb_GetUserFromVCP(vcp, inp); + rootScp = cm_RootSCachep(userp, &req); + caseFold = CM_FLAG_CASEFOLD; code = smb_LookupTIDPath(vcp, ((smb_t *)inp)->tid, &tidPathp); @@ -5495,10 +5499,10 @@ long smb_ReceiveCoreGetFileAttributes(smb_vc_t *vcp, smb_packet_t *inp, smb_pack osi_Log1(smb_logp, "SMB receive getfile attributes path %S", osi_LogSaveClientString(smb_logp, pathp)); - rootScp = cm_data.rootSCachep; - userp = smb_GetUserFromVCP(vcp, inp); + rootScp = cm_RootSCachep(userp, &req); + /* we shouldn't need this for V3 requests, but we seem to */ caseFold = CM_FLAG_CASEFOLD; @@ -5723,7 +5727,7 @@ long smb_ReceiveCoreOpen(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) cm_ReleaseUser(userp); return CM_ERROR_NOSUCHPATH; } - code = cm_NameI(cm_data.rootSCachep, pathp, caseFold | CM_FLAG_FOLLOW, userp, + code = cm_NameI(cm_RootSCachep(userp, &req), pathp, caseFold | CM_FLAG_FOLLOW, userp, tidPathp, &req, &scp); if (code) { @@ -5905,7 +5909,7 @@ long smb_ReceiveCoreUnlink(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) cm_ReleaseUser(userp); return CM_ERROR_NOSUCHPATH; } - code = cm_NameI(cm_data.rootSCachep, spacep->wdata, caseFold, userp, tidPathp, + code = cm_NameI(cm_RootSCachep(userp, &req), spacep->wdata, caseFold, userp, tidPathp, &req, &dscp); if (code) { cm_ReleaseUser(userp); @@ -6097,7 +6101,7 @@ smb_Rename(smb_vc_t *vcp, smb_packet_t *inp, clientchar_t * oldPathp, clientchar smb_StripLastComponent(spacep->wdata, &oldLastNamep, oldPathp); caseFold = CM_FLAG_FOLLOW | CM_FLAG_CASEFOLD; - code = cm_NameI(cm_data.rootSCachep, spacep->wdata, caseFold, + code = cm_NameI(cm_RootSCachep(userp, &req), spacep->wdata, caseFold, userp, tidPathp, &req, &oldDscp); if (code) { cm_ReleaseUser(userp); @@ -6117,7 +6121,7 @@ smb_Rename(smb_vc_t *vcp, smb_packet_t *inp, clientchar_t * oldPathp, clientchar #endif /* DFS_SUPPORT */ smb_StripLastComponent(spacep->wdata, &newLastNamep, newPathp); - code = cm_NameI(cm_data.rootSCachep, spacep->wdata, caseFold, + code = cm_NameI(cm_RootSCachep(userp, &req), spacep->wdata, caseFold, userp, tidPathp, &req, &newDscp); if (code) { @@ -6307,7 +6311,7 @@ smb_Link(smb_vc_t *vcp, smb_packet_t *inp, clientchar_t * oldPathp, clientchar_t spacep = inp->spacep; smb_StripLastComponent(spacep->wdata, &oldLastNamep, oldPathp); - code = cm_NameI(cm_data.rootSCachep, spacep->wdata, caseFold, + code = cm_NameI(cm_RootSCachep(userp, &req), spacep->wdata, caseFold, userp, tidPathp, &req, &oldDscp); if (code) { cm_ReleaseUser(userp); @@ -6327,7 +6331,7 @@ smb_Link(smb_vc_t *vcp, smb_packet_t *inp, clientchar_t * oldPathp, clientchar_t #endif /* DFS_SUPPORT */ smb_StripLastComponent(spacep->wdata, &newLastNamep, newPathp); - code = cm_NameI(cm_data.rootSCachep, spacep->wdata, caseFold, + code = cm_NameI(cm_RootSCachep(userp, &req), spacep->wdata, caseFold, userp, tidPathp, &req, &newDscp); if (code) { cm_ReleaseSCache(oldDscp); @@ -6554,7 +6558,7 @@ long smb_ReceiveCoreRemoveDir(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *ou cm_ReleaseUser(userp); return CM_ERROR_NOSUCHPATH; } - code = cm_NameI(cm_data.rootSCachep, spacep->wdata, caseFold | CM_FLAG_FOLLOW, + code = cm_NameI(cm_RootSCachep(userp, &req), spacep->wdata, caseFold | CM_FLAG_FOLLOW, userp, tidPathp, &req, &dscp); if (code) { @@ -8052,7 +8056,7 @@ long smb_ReceiveCoreMakeDir(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp return CM_ERROR_NOSUCHPATH; } - code = cm_NameI(cm_data.rootSCachep, spacep->wdata, + code = cm_NameI(cm_RootSCachep(userp, &req), spacep->wdata, caseFold | CM_FLAG_FOLLOW | CM_FLAG_CHECKPATH, userp, tidPathp, &req, &dscp); @@ -8191,7 +8195,7 @@ long smb_ReceiveCoreCreate(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) cm_ReleaseUser(userp); return CM_ERROR_NOSUCHPATH; } - code = cm_NameI(cm_data.rootSCachep, spacep->wdata, caseFold | CM_FLAG_FOLLOW, + code = cm_NameI(cm_RootSCachep(userp, &req), spacep->wdata, caseFold | CM_FLAG_FOLLOW, userp, tidPathp, &req, &dscp); if (code) { diff --git a/src/WINNT/afsd/smb3.c b/src/WINNT/afsd/smb3.c index 86c6e7673..c88124f49 100644 --- a/src/WINNT/afsd/smb3.c +++ b/src/WINNT/afsd/smb3.c @@ -1793,6 +1793,7 @@ long smb_ReceiveRAPNetShareEnum(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_ cm_req_t req; cm_user_t * userp; osi_hyper_t thyper; + cm_scache_t *rootScp; tp = p->parmsp + 1; /* skip over function number (always 0) */ @@ -1862,9 +1863,10 @@ long smb_ReceiveRAPNetShareEnum(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_ thyper.HighPart = 0; thyper.LowPart = 0; - cm_HoldSCache(cm_data.rootSCachep); - cm_ApplyDir(cm_data.rootSCachep, smb_rapCollectSharesProc, &rootShares, &thyper, userp, &req, NULL); - cm_ReleaseSCache(cm_data.rootSCachep); + rootScp = cm_RootSCachep(userp, &req); + cm_HoldSCache(rootScp); + cm_ApplyDir(rootScp, smb_rapCollectSharesProc, &rootShares, &thyper, userp, &req, NULL); + cm_ReleaseSCache(rootScp); cm_ReleaseUser(userp); @@ -2034,7 +2036,7 @@ long smb_ReceiveRAPNetShareGetInfo(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_pack osi_Log1(smb_logp,"ReceiveRAPNetShareGetInfo unable to resolve user [%d]", p->uid); return CM_ERROR_BADSMB; } - code = cm_NameI(cm_data.rootSCachep, shareName, + code = cm_NameI(cm_RootSCachep(userp, &req), shareName, CM_FLAG_FOLLOW | CM_FLAG_CASEFOLD | CM_FLAG_DFS_REFERRAL, userp, NULL, &req, &scp); if (code == 0) { @@ -2637,11 +2639,11 @@ long smb_ReceiveTran2Open(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t *op) } dscp = NULL; - code = cm_NameI(cm_data.rootSCachep, pathp, + code = cm_NameI(cm_RootSCachep(userp, &req), pathp, CM_FLAG_FOLLOW | CM_FLAG_CASEFOLD, userp, tidPathp, &req, &scp); if (code != 0) { - code = cm_NameI(cm_data.rootSCachep, spacep->wdata, + code = cm_NameI(cm_RootSCachep(userp, &req), spacep->wdata, CM_FLAG_FOLLOW | CM_FLAG_CASEFOLD, userp, tidPathp, &req, &dscp); cm_FreeSpace(spacep); @@ -3076,7 +3078,7 @@ long cm_GetShortName(clientchar_t *pathp, cm_user_t *userp, cm_req_t *reqp, /* smb_StripLastComponent will strip "::$DATA" if present */ smb_StripLastComponent(spacep->wdata, &lastNamep, pathp); - code = cm_NameI(cm_data.rootSCachep, spacep->wdata, + code = cm_NameI(cm_RootSCachep(userp, reqp), spacep->wdata, caseFold, userp, tidPathp, reqp, &dscp); cm_FreeSpace(spacep); @@ -3231,7 +3233,7 @@ long smb_ReceiveTran2QPathInfo(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t /* Make sure that lastComp is not NULL */ if (lastComp) { if (cm_ClientStrCmpIA(lastComp, _C("\\desktop.ini")) == 0) { - code = cm_NameI(cm_data.rootSCachep, spacep->wdata, + code = cm_NameI(cm_RootSCachep(userp, &req), spacep->wdata, CM_FLAG_CASEFOLD | CM_FLAG_DIRSEARCH | CM_FLAG_FOLLOW, @@ -3275,7 +3277,7 @@ long smb_ReceiveTran2QPathInfo(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t } /* now do namei and stat, and copy out the info */ - code = cm_NameI(cm_data.rootSCachep, pathp, + code = cm_NameI(cm_RootSCachep(userp, &req), pathp, CM_FLAG_FOLLOW | CM_FLAG_CASEFOLD, userp, tidPathp, &req, &scp); if (code) { @@ -3556,7 +3558,7 @@ long smb_ReceiveTran2SetPathInfo(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet /* Make sure that lastComp is not NULL */ if (lastComp) { if (cm_ClientStrCmpI(lastComp, _C("\\desktop.ini")) == 0) { - code = cm_NameI(cm_data.rootSCachep, spacep->wdata, + code = cm_NameI(cm_RootSCachep(userp, &req), spacep->wdata, CM_FLAG_CASEFOLD | CM_FLAG_DIRSEARCH | CM_FLAG_FOLLOW, @@ -3599,7 +3601,7 @@ long smb_ReceiveTran2SetPathInfo(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet } /* now do namei and stat, and copy out the info */ - code = cm_NameI(cm_data.rootSCachep, pathp, + code = cm_NameI(cm_RootSCachep(userp, &req), pathp, CM_FLAG_FOLLOW | CM_FLAG_CASEFOLD, userp, tidPathp, &req, &scp); if (code) { cm_ReleaseUser(userp); @@ -4171,7 +4173,7 @@ smb_ReceiveTran2GetDFSReferral(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t * for might be a known name with the final character stripped * off. */ - code = cm_NameI(cm_data.rootSCachep, &requestFileName[nbnLen+2], + code = cm_NameI(cm_RootSCachep(userp, &req), &requestFileName[nbnLen+2], CM_FLAG_FOLLOW | CM_FLAG_CASEFOLD | CM_FLAG_DFS_REFERRAL, userp, NULL, &req, &scp); if (code == 0 || @@ -4210,7 +4212,7 @@ smb_ReceiveTran2GetDFSReferral(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t /* smb_StripLastComponent will strip "::$DATA" if present */ smb_StripLastComponent(pathName, &lastComponent, temp); - code = cm_NameI(cm_data.rootSCachep, pathName, + code = cm_NameI(cm_RootSCachep(userp, &req), pathName, CM_FLAG_FOLLOW | CM_FLAG_CASEFOLD, userp, NULL, &req, &dscp); if (code == 0) { @@ -4244,7 +4246,7 @@ smb_ReceiveTran2GetDFSReferral(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t *q = '\0'; if (smb_FindShare(vcp, vcp->usersp, shareName, &p)) { - code = cm_NameI(cm_data.rootSCachep, _C(""), + code = cm_NameI(cm_RootSCachep(userp, &req), _C(""), CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW, userp, p, &req, &scp); free(p); @@ -4822,7 +4824,7 @@ long smb_T2SearchDirSingle(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t *op return 0; } - code = cm_NameI(cm_data.rootSCachep, spacep->wdata, + code = cm_NameI(cm_RootSCachep(userp, &req), spacep->wdata, CM_FLAG_FOLLOW | CM_FLAG_CASEFOLD, userp, tidPathp, &req, &scp); cm_FreeSpace(spacep); @@ -5349,7 +5351,7 @@ long smb_ReceiveTran2SearchDir(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t cm_ClientStrCpy(dsp->tidPath, lengthof(dsp->tidPath), tidPathp ? tidPathp : _C("/")); cm_ClientStrCpy(dsp->relPath, lengthof(dsp->relPath), spacep->wdata); - code = cm_NameI(cm_data.rootSCachep, spacep->wdata, + code = cm_NameI(cm_RootSCachep(userp, &req), spacep->wdata, CM_FLAG_FOLLOW | CM_FLAG_CASEFOLD, userp, tidPathp, &req, &scp); cm_FreeSpace(spacep); @@ -6062,7 +6064,7 @@ long smb_ReceiveV3OpenX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) userp = smb_GetUserFromVCP(vcp, inp); dscp = NULL; - code = cm_NameI(cm_data.rootSCachep, pathp, + code = cm_NameI(cm_RootSCachep(userp, &req), pathp, CM_FLAG_FOLLOW | CM_FLAG_CASEFOLD, userp, tidPathp, &req, &scp); @@ -6079,7 +6081,7 @@ long smb_ReceiveV3OpenX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) #endif /* DFS_SUPPORT */ if (code != 0) { - code = cm_NameI(cm_data.rootSCachep, spacep->wdata, + code = cm_NameI(cm_RootSCachep(userp, &req), spacep->wdata, CM_FLAG_FOLLOW | CM_FLAG_CASEFOLD, userp, tidPathp, &req, &dscp); if (code) { @@ -7213,7 +7215,7 @@ long smb_ReceiveNTCreateX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) if (baseFid == 0) { baseFidp = NULL; - baseDirp = cm_data.rootSCachep; + baseDirp = cm_RootSCachep(cm_rootUserp, &req); code = smb_LookupTIDPath(vcp, ((smb_t *)inp)->tid, &tidPathp); if (code == CM_ERROR_TIDIPC) { /* Attempt to use a TID allocated for IPC. The client @@ -8164,7 +8166,7 @@ long smb_ReceiveNTTranCreate(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *out if (baseFid == 0) { baseFidp = NULL; - baseDirp = cm_data.rootSCachep; + baseDirp = cm_RootSCachep(cm_rootUserp, &req); code = smb_LookupTIDPath(vcp, ((smb_t *)inp)->tid, &tidPathp); if (code == CM_ERROR_TIDIPC) { /* Attempt to use a TID allocated for IPC. The client diff --git a/src/WINNT/afsd/smb_ioctl.c b/src/WINNT/afsd/smb_ioctl.c index 55b6bf9f3..1cfdceb13 100644 --- a/src/WINNT/afsd/smb_ioctl.c +++ b/src/WINNT/afsd/smb_ioctl.c @@ -624,7 +624,7 @@ smb_ParseIoctlPath(smb_ioctl_t *ioctlp, cm_user_t *userp, cm_req_t *reqp, shareFound = smb_FindShare(ioctlp->fidp->vcp, ioctlp->uidp, shareName, &sharePath); if ( shareFound ) { /* we found a sharename, therefore use the resulting path */ - code = cm_NameI(cm_data.rootSCachep, ioctlp->prefix->wdata, + code = cm_NameI(cm_RootSCachep(userp, reqp), ioctlp->prefix->wdata, CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW, userp, sharePath, reqp, &substRootp); free(sharePath); @@ -677,7 +677,7 @@ smb_ParseIoctlPath(smb_ioctl_t *ioctlp, cm_user_t *userp, cm_req_t *reqp, shareName[i] = 0; /* terminate string */ - code = cm_NameI(cm_data.rootSCachep, ioctlp->prefix->wdata, + code = cm_NameI(cm_RootSCachep(userp, reqp), ioctlp->prefix->wdata, CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW, userp, shareName, reqp, &substRootp); if (code) { @@ -714,7 +714,7 @@ smb_ParseIoctlPath(smb_ioctl_t *ioctlp, cm_user_t *userp, cm_req_t *reqp, } } } else { - code = cm_NameI(cm_data.rootSCachep, ioctlp->prefix->wdata, + code = cm_NameI(cm_RootSCachep(userp, reqp), ioctlp->prefix->wdata, CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW, userp, ioctlp->tidPathp, reqp, &substRootp); if (code) { @@ -867,7 +867,7 @@ smb_ParseIoctlParent(smb_ioctl_t *ioctlp, cm_user_t *userp, cm_req_t *reqp, shareFound = smb_FindShare(ioctlp->fidp->vcp, ioctlp->uidp, shareName, &sharePath); if ( shareFound ) { /* we found a sharename, therefore use the resulting path */ - code = cm_NameI(cm_data.rootSCachep, ioctlp->prefix->wdata, + code = cm_NameI(cm_RootSCachep(userp, reqp), ioctlp->prefix->wdata, CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW, userp, sharePath, reqp, &substRootp); free(sharePath); @@ -894,7 +894,7 @@ smb_ParseIoctlParent(smb_ioctl_t *ioctlp, cm_user_t *userp, cm_req_t *reqp, shareName[i++] = '/'; /* add trailing slash */ shareName[i] = 0; /* terminate string */ - code = cm_NameI(cm_data.rootSCachep, ioctlp->prefix->wdata, + code = cm_NameI(cm_RootSCachep(userp, reqp), ioctlp->prefix->wdata, CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW, userp, shareName, reqp, &substRootp); if (code) return code; @@ -905,7 +905,7 @@ smb_ParseIoctlParent(smb_ioctl_t *ioctlp, cm_user_t *userp, cm_req_t *reqp, if (code) return code; } } else { - code = cm_NameI(cm_data.rootSCachep, ioctlp->prefix->wdata, + code = cm_NameI(cm_RootSCachep(userp, reqp), ioctlp->prefix->wdata, CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW, userp, ioctlp->tidPathp, reqp, &substRootp); if (code) return code;