From: Jeffrey Altman Date: Tue, 11 Aug 2009 14:37:19 +0000 (-0400) Subject: Windows: Dfs Referrals Processing. Not all errors are errors. X-Git-Tag: openafs-devel-1_5_62~55 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=1024c4cd71d2b63a3b7f608a244d90e75c933d7c;p=packages%2Fo%2Fopenafs.git Windows: Dfs Referrals Processing. Not all errors are errors. When processing a Dfs Referral request, not all lookup errors should be treated as if the path does not exist. Servers being down or busy, volumes offline, cell vldb servers not found, etc. do not mean that the client should go searching elsewhere to evaluate the path. LICENSE MIT Reviewed-on: http://gerrit.openafs.org/304 Reviewed-by: Derrick Brashear Reviewed-by: Jeffrey Altman Tested-by: Jeffrey Altman --- diff --git a/src/WINNT/afsd/smb.c b/src/WINNT/afsd/smb.c index 5f66439a8..b510a1ddc 100644 --- a/src/WINNT/afsd/smb.c +++ b/src/WINNT/afsd/smb.c @@ -1983,6 +1983,8 @@ int smb_FindShare(smb_vc_t *vcp, smb_user_t *uidp, if (cm_ClientStrCmpIA(shareName, _C("IPC$")) == 0 || cm_ClientStrCmpIA(shareName, _C("srvsvc")) == 0 || cm_ClientStrCmpIA(shareName, _C("wkssvc")) == 0 || + cm_ClientStrCmpIA(shareName, _C("spoolss")) == 0 || + cm_ClientStrCmpIA(shareName, _C("winreg")) == 0 || cm_ClientStrCmpIA(shareName, _C(SMB_IOCTL_FILENAME_NOSLASH)) == 0 || cm_ClientStrCmpIA(shareName, _C("DESKTOP.INI")) == 0 ) { diff --git a/src/WINNT/afsd/smb3.c b/src/WINNT/afsd/smb3.c index 68b44d9f9..2264ba90f 100644 --- a/src/WINNT/afsd/smb3.c +++ b/src/WINNT/afsd/smb3.c @@ -2524,7 +2524,9 @@ long smb_ReceiveTran2Open(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t *op) (cm_ClientStrCmpI(lastNamep, _C(SMB_IOCTL_FILENAME)) == 0 || ((cm_ClientStrCmpI(lastNamep, _C("\\srvsvc")) == 0 || cm_ClientStrCmpI(lastNamep, _C("\\wkssvc")) == 0 || - cm_ClientStrCmpI(lastNamep, _C("\\ipc$")) == 0) && (is_rpc = TRUE)))) { + cm_ClientStrCmpI(lastNamep, _C("\\spoolss")) == 0 || + cm_ClientStrCmpI(lastNamep, _C("\\winreg")) == 0 || + cm_ClientStrCmpI(lastNamep, _C("\\ipc$")) == 0) && (is_rpc = TRUE)))) { unsigned short file_type = 0; unsigned short device_state = 0; @@ -4093,7 +4095,13 @@ smb_ReceiveTran2GetDFSReferral(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t code = cm_NameI(cm_data.rootSCachep, &requestFileName[nbnLen+2], CM_FLAG_FOLLOW | CM_FLAG_CASEFOLD | CM_FLAG_DFS_REFERRAL, userp, NULL, &req, &scp); - if (code == 0) { + if (code == 0 || + code == CM_ERROR_ALLDOWN || + code == CM_ERROR_ALLBUSY || + code == CM_ERROR_ALLOFFLINE || + code == CM_ERROR_NOSUCHCELL || + code == CM_ERROR_NOSUCHVOLUME || + code == CM_ERROR_NOACCESS) { /* Yes it is. */ found = 1; cm_ClientStrCpy(referralPath, lengthof(referralPath), requestFileName); @@ -4204,6 +4212,8 @@ smb_ReceiveTran2GetDFSReferral(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t for ( i=0;i<=refLen; i++ ) sp[i+idx] = referralPath[i]; #endif + } else { + code = CM_ERROR_NOSUCHPATH; } } else { code = CM_ERROR_NOSUCHPATH; @@ -5880,7 +5890,9 @@ long smb_ReceiveV3OpenX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) (cm_ClientStrCmpIA(lastNamep, _C(SMB_IOCTL_FILENAME)) == 0 || ((cm_ClientStrCmpIA(lastNamep, _C("\\srvsvc")) == 0 || cm_ClientStrCmpIA(lastNamep, _C("\\wkssvc")) == 0 || - cm_ClientStrCmpIA(lastNamep, _C("ipc$")) == 0) && (is_rpc = TRUE)))) { + cm_ClientStrCmpIA(lastNamep, _C("\\spoolss")) == 0 || + cm_ClientStrCmpIA(lastNamep, _C("\\winreg")) == 0 || + cm_ClientStrCmpIA(lastNamep, _C("ipc$")) == 0) && (is_rpc = TRUE)))) { unsigned short file_type = 0; unsigned short device_state = 0; @@ -7108,7 +7120,9 @@ long smb_ReceiveNTCreateX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) if (lastNamep && (((cm_ClientStrCmpIA(lastNamep, _C("\\srvsvc")) == 0 || cm_ClientStrCmpIA(lastNamep, _C("\\wkssvc")) == 0 || - cm_ClientStrCmpIA(lastNamep, _C("ipc$")) == 0) && (is_rpc = TRUE)) || + cm_ClientStrCmpIA(lastNamep, _C("\\spoolss")) == 0 || + cm_ClientStrCmpIA(lastNamep, _C("\\winreg")) == 0 || + cm_ClientStrCmpIA(lastNamep, _C("ipc$")) == 0) && (is_rpc = TRUE)) || /* special case magic file name for receiving IOCTL requests * (since IOCTL calls themselves aren't getting through).