From: Jeffrey Altman Date: Thu, 3 Sep 2009 02:49:40 +0000 (-0400) Subject: Windows: The unnamed stream is a synonym X-Git-Tag: openafs-devel-1_5_63~49 X-Git-Url: https://git.openafs.org/?p=openafs.git;a=commitdiff_plain;h=880664bd0df8380b77cefe80379170c9c183442c;hp=ae7ef5f5b963a5c8ce4110a7352e0010cb6cdbc1 Windows: The unnamed stream is a synonym Treat a file request for "name::$DATA" as if it were specified as "name". Otherwise, the inclusion of the colon in the file name will cause it to be treated as invalid. LICENSE MIT Reviewed-on: http://gerrit.openafs.org/395 Reviewed-by: Jeffrey Altman Tested-by: Jeffrey Altman --- diff --git a/src/WINNT/afsd/smb.c b/src/WINNT/afsd/smb.c index e7151ae..8c13a84 100644 --- a/src/WINNT/afsd/smb.c +++ b/src/WINNT/afsd/smb.c @@ -2520,11 +2520,34 @@ void smb_StripLastComponent(clientchar_t *outPathp, clientchar_t **lastComponent clientchar_t *inPathp) { clientchar_t *lastSlashp; - + clientchar_t *streamp = NULL; + clientchar_t *typep = NULL; + lastSlashp = cm_ClientStrRChr(inPathp, '\\'); - if (lastComponentp) + if (lastComponentp) { *lastComponentp = lastSlashp; + } if (lastSlashp) { + /* + * If the name contains a stream name and a type + * and the stream name is the nul-string and the + * type is $DATA, then strip "::$DATA" from the + * last component string that is returned. + * + * Otherwise, return the full path name and allow + * the file name to be rejected because it contains + * a colon. + */ + typep = cm_ClientStrRChr(lastSlashp, L':'); + if (typep && cm_ClientStrCmpI(typep, L":$DATA") == 0) { + *typep = '\0'; + streamp = cm_ClientStrRChr(lastSlashp, L':'); + if (streamp && cm_ClientStrCmpI(streamp, L":") == 0) + *streamp = '\0'; + else + *typep = ':'; + } + while (1) { if (inPathp == lastSlashp) break; @@ -5578,6 +5601,13 @@ long smb_ReceiveCoreOpen(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) } #endif + share = smb_GetSMBParm(inp, 0); + attribute = smb_GetSMBParm(inp, 1); + + spacep = inp->spacep; + /* smb_StripLastComponent will strip "::$DATA" if present */ + smb_StripLastComponent(spacep->wdata, &lastNamep, pathp); + if (!cm_IsValidClientString(pathp)) { #ifdef DEBUG clientchar_t * hexp; @@ -5593,11 +5623,6 @@ long smb_ReceiveCoreOpen(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) return CM_ERROR_BADNTFILENAME; } - share = smb_GetSMBParm(inp, 0); - attribute = smb_GetSMBParm(inp, 1); - - spacep = inp->spacep; - smb_StripLastComponent(spacep->wdata, &lastNamep, pathp); if (lastNamep && cm_ClientStrCmp(lastNamep, _C(SMB_IOCTL_FILENAME)) == 0) { /* special case magic file name for receiving IOCTL requests * (since IOCTL calls themselves aren't getting through). @@ -8036,6 +8061,10 @@ long smb_ReceiveCoreCreate(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) if (!pathp) return CM_ERROR_BADSMB; + spacep = inp->spacep; + /* smb_StripLastComponent will strip "::$DATA" if present */ + smb_StripLastComponent(spacep->wdata, &lastNamep, pathp); + if (!cm_IsValidClientString(pathp)) { #ifdef DEBUG clientchar_t * hexp; @@ -8051,9 +8080,6 @@ long smb_ReceiveCoreCreate(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) return CM_ERROR_BADNTFILENAME; } - spacep = inp->spacep; - smb_StripLastComponent(spacep->wdata, &lastNamep, pathp); - userp = smb_GetUserFromVCP(vcp, inp); caseFold = CM_FLAG_CASEFOLD; diff --git a/src/WINNT/afsd/smb3.c b/src/WINNT/afsd/smb3.c index 1b87cd2..0ad8e61 100644 --- a/src/WINNT/afsd/smb3.c +++ b/src/WINNT/afsd/smb3.c @@ -2525,6 +2525,7 @@ long smb_ReceiveTran2Open(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t *op) } spacep = cm_GetSpace(); + /* smb_StripLastComponent will strip "::$DATA" if present */ smb_StripLastComponent(spacep->wdata, &lastNamep, pathp); if (lastNamep && @@ -2682,6 +2683,9 @@ long smb_ReceiveTran2Open(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t *op) return code; } } else { + /* macintosh is expensive to program for it */ + cm_FreeSpace(spacep); + #ifdef DFS_SUPPORT if (scp->fileType == CM_SCACHETYPE_DFSLINK) { int pnc = cm_VolStatus_Notify_DFS_Mapping(scp, tidPathp, lastNamep); @@ -2694,9 +2698,6 @@ long smb_ReceiveTran2Open(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t *op) return CM_ERROR_NOSUCHPATH; } #endif /* DFS_SUPPORT */ - - /* macintosh is expensive to program for it */ - cm_FreeSpace(spacep); } /* if we get here, if code is 0, the file exists and is represented by @@ -3070,6 +3071,7 @@ long cm_GetShortName(clientchar_t *pathp, cm_user_t *userp, cm_req_t *reqp, osi_hyper_t thyper; spacep = cm_GetSpace(); + /* smb_StripLastComponent will strip "::$DATA" if present */ smb_StripLastComponent(spacep->wdata, &lastNamep, pathp); code = cm_NameI(cm_data.rootSCachep, spacep->wdata, @@ -3217,6 +3219,7 @@ long smb_ReceiveTran2QPathInfo(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t */ if (infoLevel == SMB_QUERY_FILE_BASIC_INFO) { spacep = cm_GetSpace(); + /* smb_StripLastComponent will strip "::$DATA" if present */ smb_StripLastComponent(spacep->wdata, &lastComp, pathp); #ifndef SPECIAL_FOLDERS /* Make sure that lastComp is not NULL */ @@ -3533,6 +3536,7 @@ long smb_ReceiveTran2SetPathInfo(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet */ if (infoLevel == SMB_QUERY_FILE_BASIC_INFO) { spacep = cm_GetSpace(); + /* smb_StripLastComponent will strip "::$DATA" if present */ smb_StripLastComponent(spacep->wdata, &lastComp, pathp); #ifndef SPECIAL_FOLDERS /* Make sure that lastComp is not NULL */ @@ -4177,6 +4181,7 @@ smb_ReceiveTran2GetDFSReferral(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t cm_ReleaseSCache(scp); scp = 0; } + /* smb_StripLastComponent will strip "::$DATA" if present */ smb_StripLastComponent(pathName, &lastComponent, temp); code = cm_NameI(cm_data.rootSCachep, pathName, @@ -4781,6 +4786,7 @@ long smb_T2SearchDirSingle(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t *op /* try to get the vnode for the path name next */ spacep = cm_GetSpace(); + /* smb_StripLastComponent will strip "::$DATA" if present */ smb_StripLastComponent(spacep->wdata, NULL, pathp); code = smb_LookupTIDPath(vcp, p->tid, &tidPathp); if (code) { @@ -5301,6 +5307,7 @@ long smb_ReceiveTran2SearchDir(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t code = 0; } else { spacep = cm_GetSpace(); + /* smb_StripLastComponent will strip "::$DATA" if present */ smb_StripLastComponent(spacep->wdata, NULL, pathp); code = smb_LookupTIDPath(vcp, p->tid, &tidPathp); if (code) { @@ -5942,6 +5949,7 @@ long smb_ReceiveV3OpenX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) } spacep = inp->spacep; + /* smb_StripLastComponent will strip "::$DATA" if present */ smb_StripLastComponent(spacep->wdata, &lastNamep, pathp); if (lastNamep && @@ -7171,6 +7179,7 @@ long smb_ReceiveNTCreateX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) realPathp[nameLength/sizeof(clientchar_t)] = 0; spacep = inp->spacep; + /* smb_StripLastComponent will strip "::$DATA" if present */ smb_StripLastComponent(spacep->wdata, &lastNamep, realPathp); osi_Log1(smb_logp,"NTCreateX for [%S]",osi_LogSaveClientString(smb_logp,realPathp)); @@ -8094,6 +8103,7 @@ long smb_ReceiveNTTranCreate(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *out memcpy(realPathp, pathp, nameLength); realPathp[nameLength/sizeof(clientchar_t)] = 0; spacep = cm_GetSpace(); + /* smb_StripLastComponent will strip "::$DATA" if present */ smb_StripLastComponent(spacep->wdata, &lastNamep, realPathp); osi_Log1(smb_logp,"NTTranCreate %S",osi_LogSaveStringW(smb_logp,realPathp));