[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    extragear/multimedia/k3b
From:       Michal Malek <michalm () jabster ! pl>
Date:       2010-09-08 6:15:03
Message-ID: 20100908061503.971D0AC857 () svn ! kde ! org
[Download RAW message or body]

SVN commit 1172893 by mmalek:

Fixed GPF caused by invalidated iterators. Invalidation happened when items were \
                removed from QMap collection while qDeleteAll() implicitly iterated \
                through it
BUG: 241630

 M  +1 -0      ChangeLog  
 M  +27 -22    libk3b/tools/k3bcdparanoialib.cpp  


--- trunk/extragear/multimedia/k3b/ChangeLog #1172892:1172893
@@ -14,6 +14,7 @@
  * Crash on start when checking device capabilities (246822)
  * Search paths on "Programs" options are not saved (248648)
  * Crash on generation of DVD previews in DVD ripping list (249941)
+ * Crash on closing dialog after succesful audio CD ripping (241630)
 
 2.0.1
 =====
--- trunk/extragear/multimedia/k3b/libk3b/tools/k3bcdparanoialib.cpp #1172892:1172893
@@ -1,6 +1,7 @@
 /*
  *
  * Copyright (C) 2003-2008 Sebastian Trueg <trueg@k3b.org>
+ * Copyright (C) 2010 Michal Malek <michalm@jabster.pl>
  *
  * This file is part of the K3b project.
  * Copyright (C) 1998-2008 Sebastian Trueg <trueg@k3b.org>
@@ -202,26 +203,17 @@
 
 namespace K3b {
     /**
-     * Internal class used by K3b::CdparanoiaLib
+     * Internal class used by CdparanoiaLib
      */
     class CdparanoiaLibData
     {
     public:
-        CdparanoiaLibData( K3b::Device::Device* dev )
-            : m_device(dev),
-              m_drive(0),
-              m_paranoia(0),
-              m_currentSector(0) {
-            s_dataMap.insert( dev, this );
-        }
-
-        ~CdparanoiaLibData() {
+        ~CdparanoiaLibData()
+        {
             paranoiaFree();
-
-            s_dataMap.remove( m_device );
         }
 
-        K3b::Device::Device* device() const { return m_device; }
+        Device::Device* device() const { return m_device; }
         void paranoiaModeSet( int );
         bool paranoiaInit();
         void paranoiaFree();
@@ -231,27 +223,40 @@
         long lastSector( int );
         long sector() const { return m_currentSector; }
 
-        static K3b::CdparanoiaLibData* data( K3b::Device::Device* dev ) {
-            QMap<K3b::Device::Device*, K3b::CdparanoiaLibData*>::const_iterator it = \
                s_dataMap.constFind( dev );
-            if( it == s_dataMap.constEnd() )
-                return new K3b::CdparanoiaLibData( dev );
+        static CdparanoiaLibData* data( Device::Device* dev )
+        {
+            QMap<Device::Device*, CdparanoiaLibData*>::const_iterator it = \
s_dataMap.constFind( dev ); +            if( it == s_dataMap.constEnd() ) {
+                CdparanoiaLibData* data = new CdparanoiaLibData( dev );
+                s_dataMap.insert( dev, data );
+                return data;
+            }
             else
                 return *it;
         }
 
-        static void freeAll() {
-            // clean up all K3b::CdparanoiaLibData instances
+        static void freeAll()
+        {
+            // clean up all CdparanoiaLibData instances
             qDeleteAll( s_dataMap );
             s_dataMap.clear();
         }
 
     private:
+        CdparanoiaLibData( Device::Device* dev )
+            : m_device(dev),
+              m_drive(0),
+              m_paranoia(0),
+              m_currentSector(0)
+        {
+        }
+
         //
-        // We have exactly one instance of K3b::CdparanoiaLibData per device
+        // We have exactly one instance of CdparanoiaLibData per device
         //
-        static QMap<K3b::Device::Device*, K3b::CdparanoiaLibData*> s_dataMap;
+        static QMap<Device::Device*, CdparanoiaLibData*> s_dataMap;
 
-        K3b::Device::Device* m_device;
+        Device::Device* m_device;
 
         cdrom_drive* m_drive;
         cdrom_paranoia* m_paranoia;


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic