fixed: don't allow copying a CCriticalSection, the result is unclear
authorbobo1on1 <bobo1on1@svn>
Sat, 11 Sep 2010 23:36:11 +0000 (23:36 +0000)
committerbobo1on1 <bobo1on1@svn>
Sat, 11 Sep 2010 23:36:11 +0000 (23:36 +0000)
(cherry picked from commit 929699fc6b0568cc899c1cb8f024802c9fcf3aa3)

git-svn-id: https://xbmc.svn.sourceforge.net/svnroot/xbmc/branches/Dharma@33680 568bbfeb-2a22-0410-94d2-cc84cf5bfa90

xbmc/ApplicationMessenger.cpp
xbmc/FileSystem/Directory.cpp
xbmc/FileSystem/PluginDirectory.cpp
xbmc/FileSystem/RSSDirectory.cpp
xbmc/GUIDialogFileBrowser.cpp
xbmc/GUIMediaWindow.cpp
xbmc/lib/libjsonrpc/TCPServer.cpp
xbmc/lib/libjsonrpc/TCPServer.h
xbmc/utils/CriticalSection.cpp
xbmc/utils/CriticalSection.h

index d770246..ff0d4fb 100644 (file)
@@ -736,7 +736,9 @@ void CApplicationMessenger::MediaPlay(const CFileItem &item)
 void CApplicationMessenger::MediaPlay(const CFileItemList &list, int song)
 {
   ThreadMessage tMsg = {TMSG_MEDIA_PLAY};
-  tMsg.lpVoid = (void *)new CFileItemList(list);
+  CFileItemList* listcopy = new CFileItemList();
+  listcopy->Copy(list);
+  tMsg.lpVoid = (void*)listcopy;
   tMsg.dwParam1 = song;
   tMsg.dwParam2 = 1;
   SendMessage(tMsg, true);
@@ -805,7 +807,9 @@ void CApplicationMessenger::PlayListPlayerAdd(int playlist, const CFileItem &ite
 void CApplicationMessenger::PlayListPlayerAdd(int playlist, const CFileItemList &list)
 {
   ThreadMessage tMsg = {TMSG_PLAYLISTPLAYER_ADD};
-  tMsg.lpVoid = (void *)new CFileItemList(list);
+  CFileItemList* listcopy = new CFileItemList();
+  listcopy->Copy(list);
+  tMsg.lpVoid = (void*)listcopy;
   tMsg.dwParam1 = playlist;
   SendMessage(tMsg, true);
 }
index c7f4863..df3ee99 100644 (file)
@@ -100,7 +100,7 @@ public:
       list.Clear();
       return false;
     }
-    list = m_list;
+    list.Copy(m_list);
     return true;
   }
 
index 7cd2a0f..a92cc83 100644 (file)
@@ -179,7 +179,8 @@ bool CPluginDirectory::AddItems(int handle, const CFileItemList *items, int tota
   }
 
   CPluginDirectory *dir = globalHandles[handle];
-  CFileItemList pItemList = *items;
+  CFileItemList pItemList;
+  pItemList.Copy(*items);
   dir->m_listItems->Append(pItemList);
   dir->m_totalItems = totalItems;
 
index 7cca115..814ead1 100644 (file)
@@ -554,7 +554,7 @@ bool CRSSDirectory::GetDirectory(const CStdString& path, CFileItemList &items)
   /* check cache */
   if(m_path == strPath)
   {
-    items = m_items;
+    items.Copy(m_items);
     return true;
   }
 
@@ -604,7 +604,7 @@ bool CRSSDirectory::GetDirectory(const CStdString& path, CFileItemList &items)
   items.AddSortMethod(SORT_METHOD_SIZE     , 553, LABEL_MASKS("%L", "%I", "%L", "%I"));  // FileName, Size | Foldername, Size
   items.AddSortMethod(SORT_METHOD_DATE     , 552, LABEL_MASKS("%L", "%J", "%L", "%J"));  // FileName, Date | Foldername, Date
 
-  m_items = items;
+  m_items.Copy(items);
   m_path  = strPath;
 
   return true;
index e7eafa1..ab1bb02 100644 (file)
@@ -367,7 +367,7 @@ void CGUIDialogFileBrowser::Update(const CStdString &strDirectory)
     }
 
     ClearFileItems();
-    *m_vecItems = items;
+    m_vecItems->Copy(items);
     m_Directory->m_strPath = strDirectory;
     m_strParentPath = strParentPath;
   }
index 721e7bc..9c75835 100644 (file)
@@ -725,7 +725,7 @@ bool CGUIMediaWindow::Update(const CStdString &strDirectory)
   }
 
   ClearFileItems();
-  *m_vecItems = items;
+  m_vecItems->Copy(items);
 
   // if we're getting the root source listing
   // make sure the path history is clean
index e879696..60c39fa 100644 (file)
@@ -237,6 +237,17 @@ CTCPServer::CTCPClient::CTCPClient()
   m_addrlen = sizeof(struct sockaddr);
 }
 
+CTCPServer::CTCPClient::CTCPClient(const CTCPClient& client)
+{
+  Copy(client);
+}
+
+CTCPServer::CTCPClient& CTCPServer::CTCPClient::operator=(const CTCPClient& client)
+{
+  Copy(client);
+  return *this;
+}
+
 int CTCPServer::CTCPClient::GetPermissionFlags()
 {
   return OPERATION_PERMISSION_ALL;
@@ -284,3 +295,15 @@ void CTCPServer::CTCPClient::Disconnect()
     m_socket = -1;
   }
 }
+
+void CTCPServer::CTCPClient::Copy(const CTCPClient& client)
+{
+  m_socket            = client.m_socket;
+  m_cliaddr           = client.m_cliaddr;
+  m_addrlen           = client.m_addrlen;
+  m_announcementflags = client.m_announcementflags;
+  m_beginBrackets     = client.m_beginBrackets;
+  m_endBrackets       = client.m_endBrackets;
+  m_buffer            = client.m_buffer;
+}
+
index 50f4a13..6ba1fe0 100644 (file)
@@ -37,6 +37,10 @@ namespace JSONRPC
     {
     public:
       CTCPClient();
+      //Copying a CCriticalSection is not allowed, so copy everything but that
+      //when adding a member variable, make sure to copy it in CTCPClient::Copy
+      CTCPClient(const CTCPClient& client);
+      CTCPClient& operator=(const CTCPClient& client);
       virtual int  GetPermissionFlags();
       virtual int  GetAnnouncementFlags();
       virtual bool SetAnnouncementFlags(int flags);
@@ -49,6 +53,7 @@ namespace JSONRPC
       CCriticalSection m_critSection;
 
     private:
+      void Copy(const CTCPClient& client);
       int m_announcementflags;
       int m_beginBrackets, m_endBrackets;
       std::string m_buffer;
index c20c3a6..5e5374e 100644 (file)
@@ -32,18 +32,6 @@ CCriticalSection::~CCriticalSection()
   m_criticalSection.Destroy();
 }
 
-//////////////////////////////////////////////////////////////////////
-CCriticalSection::CCriticalSection(const CCriticalSection& section)
-{
-  *this = section;
-}
-
-CCriticalSection& CCriticalSection::operator=(const CCriticalSection& section)
-{
-  if (this == &section) return * this;
-  return *this;
-}
-
 // The C API.
 void  InitializeCriticalSection(CCriticalSection* section)             { section->getCriticalSection().Initialize(); }
 void  DeleteCriticalSection(CCriticalSection* section)                 { section->getCriticalSection().Destroy(); }
index a29f9fd..a574b85 100644 (file)
@@ -45,13 +45,14 @@ public:
   CCriticalSection();
   virtual ~CCriticalSection();
 
-  CCriticalSection(const CCriticalSection& section);
-  CCriticalSection& operator=(const CCriticalSection& section);
-
   XCriticalSection& getCriticalSection() { return m_criticalSection; }
 
 private:
   XCriticalSection m_criticalSection;
+
+  //don't allow copying a CCriticalSection
+  CCriticalSection(const CCriticalSection& section) {}
+  CCriticalSection& operator=(const CCriticalSection& section) {return *this;}
 };
 
 // The CCritical section overloads.