Server: Corrected synchronization of SMB1Session and SMB2Session TreeID and FileID allocation methods

This commit is contained in:
Tal Aloni 2017-09-28 16:35:54 +03:00
parent 5276088159
commit 7eda93f5da
2 changed files with 38 additions and 34 deletions

View file

@ -41,6 +41,8 @@ namespace SMBLibrary.Server
} }
public ushort? AddConnectedTree(ISMBShare share) public ushort? AddConnectedTree(ISMBShare share)
{
lock (m_connection)
{ {
ushort? treeID = m_connection.AllocateTreeID(); ushort? treeID = m_connection.AllocateTreeID();
if (treeID.HasValue) if (treeID.HasValue)
@ -49,6 +51,7 @@ namespace SMBLibrary.Server
} }
return treeID; return treeID;
} }
}
public ISMBShare GetConnectedTree(ushort treeID) public ISMBShare GetConnectedTree(ushort treeID)
{ {
@ -63,7 +66,7 @@ namespace SMBLibrary.Server
m_connectedTrees.TryGetValue(treeID, out share); m_connectedTrees.TryGetValue(treeID, out share);
if (share != null) if (share != null)
{ {
lock (m_openFiles) lock (m_connection)
{ {
List<ushort> fileIDList = new List<ushort>(m_openFiles.Keys); List<ushort> fileIDList = new List<ushort>(m_openFiles.Keys);
foreach (ushort fileID in fileIDList) foreach (ushort fileID in fileIDList)
@ -75,10 +78,10 @@ namespace SMBLibrary.Server
m_openFiles.Remove(fileID); m_openFiles.Remove(fileID);
} }
} }
}
m_connectedTrees.Remove(treeID); m_connectedTrees.Remove(treeID);
} }
} }
}
public bool IsTreeConnected(ushort treeID) public bool IsTreeConnected(ushort treeID)
{ {
@ -93,17 +96,17 @@ namespace SMBLibrary.Server
} }
public ushort? AddOpenFile(ushort treeID, string shareName, string relativePath, object handle) public ushort? AddOpenFile(ushort treeID, string shareName, string relativePath, object handle)
{
lock (m_connection)
{ {
ushort? fileID = m_connection.AllocateFileID(); ushort? fileID = m_connection.AllocateFileID();
if (fileID.HasValue) if (fileID.HasValue)
{
lock (m_openFiles)
{ {
m_openFiles.Add(fileID.Value, new OpenFileObject(treeID, shareName, relativePath, handle)); m_openFiles.Add(fileID.Value, new OpenFileObject(treeID, shareName, relativePath, handle));
} }
}
return fileID; return fileID;
} }
}
public OpenFileObject GetOpenFileObject(ushort fileID) public OpenFileObject GetOpenFileObject(ushort fileID)
{ {
@ -114,7 +117,7 @@ namespace SMBLibrary.Server
public void RemoveOpenFile(ushort fileID) public void RemoveOpenFile(ushort fileID)
{ {
lock (m_openFiles) lock (m_connection)
{ {
m_openFiles.Remove(fileID); m_openFiles.Remove(fileID);
} }
@ -123,7 +126,7 @@ namespace SMBLibrary.Server
public List<string> ListOpenFiles() public List<string> ListOpenFiles()
{ {
List<string> result = new List<string>(); List<string> result = new List<string>();
lock (m_openFiles) lock (m_connection)
{ {
foreach (OpenFileObject openFile in m_openFiles.Values) foreach (OpenFileObject openFile in m_openFiles.Values)
{ {

View file

@ -61,6 +61,8 @@ namespace SMBLibrary.Server
} }
public uint? AddConnectedTree(ISMBShare share) public uint? AddConnectedTree(ISMBShare share)
{
lock (m_connectedTrees)
{ {
uint? treeID = AllocateTreeID(); uint? treeID = AllocateTreeID();
if (treeID.HasValue) if (treeID.HasValue)
@ -69,17 +71,13 @@ namespace SMBLibrary.Server
} }
return treeID; return treeID;
} }
}
public ISMBShare GetConnectedTree(uint treeID) public ISMBShare GetConnectedTree(uint treeID)
{ {
if (m_connectedTrees.ContainsKey(treeID)) ISMBShare result;
{ m_connectedTrees.TryGetValue(treeID, out result);
return m_connectedTrees[treeID]; return result;
}
else
{
return null;
}
} }
public void DisconnectTree(uint treeID) public void DisconnectTree(uint treeID)
@ -101,9 +99,12 @@ namespace SMBLibrary.Server
} }
} }
} }
lock (m_connectedTrees)
{
m_connectedTrees.Remove(treeID); m_connectedTrees.Remove(treeID);
} }
} }
}
public bool IsTreeConnected(uint treeID) public bool IsTreeConnected(uint treeID)
{ {
@ -130,6 +131,8 @@ namespace SMBLibrary.Server
} }
public FileID? AddOpenFile(uint treeID, string shareName, string relativePath, object handle) public FileID? AddOpenFile(uint treeID, string shareName, string relativePath, object handle)
{
lock (m_openFiles)
{ {
ulong? volatileFileID = AllocateVolatileFileID(); ulong? volatileFileID = AllocateVolatileFileID();
if (volatileFileID.HasValue) if (volatileFileID.HasValue)
@ -139,12 +142,10 @@ namespace SMBLibrary.Server
// [MS-SMB2] FileId.Persistent MUST be set to Open.DurableFileId. // [MS-SMB2] FileId.Persistent MUST be set to Open.DurableFileId.
// Note: We don't support durable handles so we use volatileFileID. // Note: We don't support durable handles so we use volatileFileID.
fileID.Persistent = volatileFileID.Value; fileID.Persistent = volatileFileID.Value;
lock (m_openFiles)
{
m_openFiles.Add(volatileFileID.Value, new OpenFileObject(treeID, shareName, relativePath, handle)); m_openFiles.Add(volatileFileID.Value, new OpenFileObject(treeID, shareName, relativePath, handle));
}
return fileID; return fileID;
} }
}
return null; return null;
} }