Browse Source

All matching opened files will now be closed during logoff

Tal Aloni 8 years ago
parent
commit
9141665ac6

+ 7 - 1
SMBLibrary/Server/ConnectionState/SMB1ConnectionState.cs

@@ -79,7 +79,13 @@ namespace SMBLibrary.Server
 
         public void RemoveSession(ushort userID)
         {
-            m_sessions.Remove(userID);
+            SMB1Session session;
+            m_sessions.TryGetValue(userID, out session);
+            if (session != null)
+            {
+                session.Close();
+                m_sessions.Remove(userID);
+            }
         }
 
         /// <summary>

+ 12 - 0
SMBLibrary/Server/ConnectionState/SMB1Session.cs

@@ -152,6 +152,18 @@ namespace SMBLibrary.Server
             m_openSearches.Remove(searchHandle);
         }
 
+        /// <summary>
+        /// Free all resources used by this session
+        /// </summary>
+        public void Close()
+        {
+            List<ushort> treeIDList = new List<ushort>(m_connectedTrees.Keys);
+            foreach (ushort treeID in treeIDList)
+            {
+                DisconnectTree(treeID);
+            }
+        }
+
         public ushort UserID
         {
             get

+ 7 - 1
SMBLibrary/Server/ConnectionState/SMB2ConnectionState.cs

@@ -60,7 +60,13 @@ namespace SMBLibrary.Server
 
         public void RemoveSession(ulong sessionID)
         {
-            m_sessions.Remove(sessionID);
+            SMB2Session session;
+            m_sessions.TryGetValue(sessionID, out session);
+            if (session != null)
+            {
+                session.Close();
+                m_sessions.Remove(sessionID);
+            }
         }
 
         public void ClearSessions()

+ 12 - 0
SMBLibrary/Server/ConnectionState/SMB2Session.cs

@@ -152,6 +152,18 @@ namespace SMBLibrary.Server
             m_openSearches.Remove(fileID);
         }
 
+        /// <summary>
+        /// Free all resources used by this session
+        /// </summary>
+        public void Close()
+        {
+            List<uint> treeIDList = new List<uint>(m_connectedTrees.Keys);
+            foreach (uint treeID in treeIDList)
+            {
+                DisconnectTree(treeID);
+            }
+        }
+
         public byte[] SessionKey
         {
             get