Bug 120490 - Crash when trying to change data sample ranges
Summary: Crash when trying to change data sample ranges
Status: RESOLVED FIXED
Alias: None
Product: kst
Classification: Applications
Component: general (show other bugs)
Version: 1.x
Platform: unspecified Linux
: NOR crash
Target Milestone: ---
Assignee: kst
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2006-01-20 03:16 UTC by Andrew Walker
Modified: 2006-01-24 20:38 UTC (History)
0 users

See Also:
Latest Commit:
Version Fixed In:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Andrew Walker 2006-01-20 03:16:59 UTC
Version:           HEAD (using KDE KDE 3.4.0)
OS:                Linux

PROBLEM:
When the user clicks on the Change Data Sample Ranges Kst can crash

STEPS TO REPRODUCE:
Open the older demo.kst file
This will cause the information message to appear stating "The Kst file could not be loaded in its entirety due to missing objects or data." with PSD1-cleaned_pitch underneath.
Hit OK
Click on the Change Data Sample Ranges icon

RESULTS:
Crash

EXPECTED RESULTS:
Dialog is launched

Backtrace follows:
Using host libthread_db library "/lib/tls/libthread_db.so.1".
[Thread debugging using libthread_db enabled]
[New Thread -187480352 (LWP 13323)]
[New Thread -192996432 (LWP 13324)]
[Thread debugging using libthread_db enabled]
[New Thread -187480352 (LWP 13323)]
[New Thread -192996432 (LWP 13324)]
[Thread debugging using libthread_db enabled]
[New Thread -187480352 (LWP 13323)]
[New Thread -192996432 (LWP 13324)]
[KCrash handler]
#4  0xf6f1fdaa in KstChangeNptsDialogI::updateTimeCombo (this=0x8cbcad8)
    at kstsharedptr.h:136
#5  0xf6fa8954 in KstChangeNptsDialog::qt_invoke (this=0x8cbcad8, _id=51, 
    _o=0xfee0f700) at changenptsdialog.moc:85
#6  0xf6f20fe3 in KstChangeNptsDialogI::qt_invoke (this=0x8cbcad8, _id=51, 
    _o=0xfee0f700) at kstchangenptsdialog_i.moc:118
#7  0xf5b4d369 in QObject::activate_signal () from /usr/qt/lib/libqt-mt.so.3
#8  0xf5b4db8d in QObject::activate_signal () from /usr/qt/lib/libqt-mt.so.3
#9  0xf5ed7f54 in QListBox::selectionChanged () from /usr/qt/lib/libqt-mt.so.3
#10 0xf5c2af85 in QListBox::selectAll () from /usr/qt/lib/libqt-mt.so.3
#11 0xf6f20f81 in KstChangeNptsDialogI::showChangeNptsDialog (this=0x8cbcad8)
    at kstchangenptsdialog_i.cpp:83
#12 0xf6f579dd in KstApp::showChangeNptsDialog (this=0x0) at kst.cpp:2006
#13 0xf6f669b5 in KstApp::qt_invoke (this=0x89caf20, _id=219, _o=0xfee0f8c0)
    at kst.moc:586
#14 0xf5b4d369 in QObject::activate_signal () from /usr/qt/lib/libqt-mt.so.3
#15 0xf5b4db8d in QObject::activate_signal () from /usr/qt/lib/libqt-mt.so.3
#16 0xf6525ea9 in KAction::activated () from /usr/lib/libkdeui.so.4
#17 0xf6525ecd in KAction::slotActivated () from /usr/lib/libkdeui.so.4
#18 0xf6525f7c in KAction::qt_invoke () from /usr/lib/libkdeui.so.4
#19 0xf5b4d303 in QObject::activate_signal () from /usr/qt/lib/libqt-mt.so.3
#20 0xf5b4db8d in QObject::activate_signal () from /usr/qt/lib/libqt-mt.so.3
#21 0xf5ecfaf4 in QButton::clicked () from /usr/qt/lib/libqt-mt.so.3
#22 0xf5bec6bb in QButton::mouseReleaseEvent () from /usr/qt/lib/libqt-mt.so.3
#23 0xf5b885c4 in QWidget::event () from /usr/qt/lib/libqt-mt.so.3
#24 0xf5ae8a91 in QApplication::internalNotify ()
   from /usr/qt/lib/libqt-mt.so.3
#25 0xf5ae8d5f in QApplication::notify () from /usr/qt/lib/libqt-mt.so.3
#26 0xf626d4c8 in KApplication::notify () from /usr/lib/libkdecore.so.4
#27 0xf5a82195 in QETWidget::translateMouseEvent ()
   from /usr/qt/lib/libqt-mt.so.3
#28 0xf5a80402 in QApplication::x11ProcessEvent ()
   from /usr/qt/lib/libqt-mt.so.3
#29 0xf5a93456 in QEventLoop::processEvents () from /usr/qt/lib/libqt-mt.so.3
#30 0xf5afe3a3 in QEventLoop::enterLoop () from /usr/qt/lib/libqt-mt.so.3
#31 0xf5afe300 in QEventLoop::exec () from /usr/qt/lib/libqt-mt.so.3
#32 0xf5ae7c90 in QApplication::exec () from /usr/qt/lib/libqt-mt.so.3
#33 0x08054b56 in main (argc=1, argv=0xfee10fd4) at main.cpp:811
Comment 1 George Staikos 2006-01-20 04:28:28 UTC
Seems to be related or duplicate of #118696

I can't reproduce it.  Is the datasource pointer null in updateTimeCombo?
Comment 2 Andrew Walker 2006-01-20 22:16:36 UTC
SVN commit 500673 by arwalker:

CCBUG:120490 Prevent crash due to invalid pointers. The numerous 'FIXME: broken' comments should be addressed before shipping 1.2 as the associated code does appaer to be incorrectly written.

 M  +79 -63    kstchangenptsdialog_i.cpp  


--- trunk/extragear/graphics/kst/kst/kstchangenptsdialog_i.cpp #500672:500673
@@ -55,6 +55,7 @@
 
 bool KstChangeNptsDialogI::updateChangeNptsDialog() {
   QStringList qsl;
+  int inserted = 0;
   
   for (uint i_vector = 0; i_vector < CurveList->count(); i_vector++) {
     if (CurveList->isSelected(i_vector)) {
@@ -62,15 +63,20 @@
     }
   }
   CurveList->clear();
+  
   KstRVectorList rvl = kstObjectSubList<KstVector,KstRVector>(KST::vectorList);
   /* insert vectors into ChangeNptsCurveList */
   for (uint i = 0; i < rvl.count(); i++) {
-    rvl[i]->readLock();
-    CurveList->insertItem(rvl[i]->tagName(), -1);
-    if (qsl.contains(rvl[i]->tagName())) {
-      CurveList->setSelected(i, true);
+    KstRVectorPtr vector = rvl[i]; // FIXME: broken
+    if (vector) {
+      vector->readLock();
+      CurveList->insertItem(vector->tagName(), -1);
+      if (qsl.contains(vector->tagName())) {
+        CurveList->setSelected(inserted, true);
+      }
+      inserted++;
+      vector->readUnlock();
     }
-    rvl[i]->readUnlock();
   }
   return !qsl.isEmpty();
 }
@@ -92,45 +98,49 @@
   for (uint i_vector = 0; i_vector < CurveList->count(); ++i_vector) {
     if (CurveList->isSelected(i_vector)) {
       KstRVectorPtr vector = rvl[i_vector]; // FIXME: broken
-      int f0, n;
-      vector->readLock();
-      if (_kstDataRange->isStartRelativeTime() && vector->dataSource()) {
-        vector->dataSource()->readLock();
-        f0 = vector->dataSource()->sampleForTime(_kstDataRange->f0Value());
-        vector->dataSource()->readUnlock();
-      } else if (_kstDataRange->isStartAbsoluteTime() && vector->dataSource()) {
-        vector->dataSource()->readLock();
-        f0 = vector->dataSource()->sampleForTime(_kstDataRange->f0DateTimeValue());
-        vector->dataSource()->readUnlock();
-      } else {
-        f0 = int(_kstDataRange->f0Value());
-      }
+      if (vector) {
+        int f0, n;
+        vector->readLock();
+        if (_kstDataRange->isStartRelativeTime() && vector->dataSource()) {
+          vector->dataSource()->readLock();
+          f0 = vector->dataSource()->sampleForTime(_kstDataRange->f0Value());
+          vector->dataSource()->readUnlock();
+        } else if (_kstDataRange->isStartAbsoluteTime() && vector->dataSource()) {
+          vector->dataSource()->readLock();
+          f0 = vector->dataSource()->sampleForTime(_kstDataRange->f0DateTimeValue());
+          vector->dataSource()->readUnlock();
+        } else {
+          f0 = int(_kstDataRange->f0Value());
+        }
       
-      if (_kstDataRange->isRangeRelativeTime() && vector->dataSource()) {
-        KstDataSourcePtr ds = vector->dataSource();
-        ds->readLock();
-        double nValStored = _kstDataRange->nValue();
-        if (_kstDataRange->CountFromEnd->isChecked()) {
-          int frameCount = ds->frameCount(vector->field());
-          double msCount = ds->relativeTimeForSample(frameCount - 1);
-          n = frameCount - 1 - ds->sampleForTime(msCount - nValStored);
+        if (_kstDataRange->isRangeRelativeTime() && vector->dataSource()) {
+          KstDataSourcePtr ds = vector->dataSource();
+          if (ds) {
+            ds->readLock();
+            double nValStored = _kstDataRange->nValue();
+            if (_kstDataRange->CountFromEnd->isChecked()) {
+              int frameCount = ds->frameCount(vector->field());
+              double msCount = ds->relativeTimeForSample(frameCount - 1);
+              n = frameCount - 1 - ds->sampleForTime(msCount - nValStored);
+            } else {
+              double fTime = ds->relativeTimeForSample(f0);
+              n = ds->sampleForTime(fTime + nValStored) - ds->sampleForTime(fTime);
+            }
+            ds->readUnlock();
+          }
         } else {
-          double fTime = ds->relativeTimeForSample(f0);
-          n = ds->sampleForTime(fTime + nValStored) - ds->sampleForTime(fTime);
+          n = int(_kstDataRange->nValue());
         }
-        ds->readUnlock();
-      } else {
-        n = int(_kstDataRange->nValue());
+        vector->readUnlock();
+        vector->writeLock();
+        vector->changeFrames(
+          (_kstDataRange->CountFromEnd->isChecked() ? -1 : f0),
+          (_kstDataRange->ReadToEnd->isChecked() ? -1 : n),
+          _kstDataRange->Skip->value(),
+          _kstDataRange->DoSkip->isChecked(),
+          _kstDataRange->DoFilter->isChecked());
+        vector->writeUnlock();
       }
-      vector->readUnlock();
-      vector->writeLock();
-      vector->changeFrames(
-        (_kstDataRange->CountFromEnd->isChecked() ? -1 : f0),
-        (_kstDataRange->ReadToEnd->isChecked() ? -1 : n),
-        _kstDataRange->Skip->value(),
-        _kstDataRange->DoSkip->isChecked(),
-        _kstDataRange->DoFilter->isChecked());
-      vector->writeUnlock();
     }
   }
 
@@ -145,25 +155,27 @@
   }
 
   KstRVectorPtr vector = rvl[index];
-  vector->writeLock();
+  if (vector) {
+    vector->writeLock();
 
-  _kstDataRange->_startUnits->setCurrentItem(0);
-  _kstDataRange->_rangeUnits->setCurrentItem(0);
+    _kstDataRange->_startUnits->setCurrentItem(0);
+    _kstDataRange->_rangeUnits->setCurrentItem(0);
 
-  /* fill the vector range entries */
-  _kstDataRange->CountFromEnd->setChecked(vector->countFromEOF());
-  _kstDataRange->setF0Value(vector->reqStartFrame());
+    /* fill the vector range entries */
+    _kstDataRange->CountFromEnd->setChecked(vector->countFromEOF());
+    _kstDataRange->setF0Value(vector->reqStartFrame());
 
-  /* fill number of frames entries */
-  _kstDataRange->ReadToEnd->setChecked(vector->readToEOF());
-  _kstDataRange->setNValue(vector->reqNumFrames());
+    /* fill number of frames entries */
+    _kstDataRange->ReadToEnd->setChecked(vector->readToEOF());
+    _kstDataRange->setNValue(vector->reqNumFrames());
 
-  /* fill in frames to skip box */
-  _kstDataRange->Skip->setValue(vector->skip());
-  _kstDataRange->DoSkip->setChecked(vector->doSkip());
-  _kstDataRange->DoFilter->setChecked(vector->doAve());
-  _kstDataRange->updateEnables();
-  vector->writeUnlock();
+    /* fill in frames to skip box */
+    _kstDataRange->Skip->setValue(vector->skip());
+    _kstDataRange->DoSkip->setChecked(vector->doSkip());
+    _kstDataRange->DoFilter->setChecked(vector->doAve());
+    _kstDataRange->updateEnables();
+    vector->writeUnlock();
+  }
 }
 
 
@@ -174,14 +186,18 @@
   for (uint i = 0; i < cnt; ++i) {
     if (CurveList->isSelected(i)) {
       KstRVectorPtr vector = rvl[i]; // FIXME: broken
-      vector->readLock();
-      KstDataSourcePtr ds = vector->dataSource();
-      vector->readUnlock();
-      ds->readLock();
-      supportsTime = ds->supportsTimeConversions();
-      ds->readUnlock();
-      if (!supportsTime) {
-        break;
+      if (vector) {
+        vector->readLock();
+        KstDataSourcePtr ds = vector->dataSource();
+        vector->readUnlock();
+        if (ds) {
+          ds->readLock();
+          supportsTime = ds->supportsTimeConversions();
+          ds->readUnlock();
+          if (!supportsTime) {
+            break;
+          }
+        }
       }
     }
   }
Comment 3 Andrew Walker 2006-01-24 20:21:30 UTC
SVN commit 502061 by arwalker:

CCBUG:120490 No longer assume a direct correspondence between the list box entries and the vector list entries.

 M  +9 -6      kstchangenptsdialog_i.cpp  


--- trunk/extragear/graphics/kst/kst/kstchangenptsdialog_i.cpp #502060:502061
@@ -65,9 +65,9 @@
   CurveList->clear();
   
   KstRVectorList rvl = kstObjectSubList<KstVector,KstRVector>(KST::vectorList);
-  /* insert vectors into ChangeNptsCurveList */
+  // insert vectors into ChangeNptsCurveList
   for (uint i = 0; i < rvl.count(); i++) {
-    KstRVectorPtr vector = rvl[i]; // FIXME: broken
+    KstRVectorPtr vector = rvl[i];
     if (vector) {
       vector->readLock();
       CurveList->insertItem(vector->tagName(), -1);
@@ -95,11 +95,12 @@
 
 void KstChangeNptsDialogI::applyNptsChange() {
   KstRVectorList rvl = kstObjectSubList<KstVector,KstRVector>(KST::vectorList);
-  for (uint i_vector = 0; i_vector < CurveList->count(); ++i_vector) {
-    if (CurveList->isSelected(i_vector)) {
-      KstRVectorPtr vector = rvl[i_vector]; // FIXME: broken
+  for (uint i = 0; i < CurveList->count(); ++i) {
+    if (CurveList->isSelected(i)) {
+      KstRVectorPtr vector = *(rvl.findTag(CurveList->text(i)));
       if (vector) {
         int f0, n;
+        
         vector->readLock();
         if (_kstDataRange->isStartRelativeTime() && vector->dataSource()) {
           vector->dataSource()->readLock();
@@ -132,6 +133,7 @@
           n = int(_kstDataRange->nValue());
         }
         vector->readUnlock();
+        
         vector->writeLock();
         vector->changeFrames(
           (_kstDataRange->CountFromEnd->isChecked() ? -1 : f0),
@@ -174,6 +176,7 @@
     _kstDataRange->DoSkip->setChecked(vector->doSkip());
     _kstDataRange->DoFilter->setChecked(vector->doAve());
     _kstDataRange->updateEnables();
+    
     vector->writeUnlock();
   }
 }
@@ -185,7 +188,7 @@
   bool supportsTime = true;
   for (uint i = 0; i < cnt; ++i) {
     if (CurveList->isSelected(i)) {
-      KstRVectorPtr vector = rvl[i]; // FIXME: broken
+      KstRVectorPtr vector = *(rvl.findTag(CurveList->text(i)));
       if (vector) {
         vector->readLock();
         KstDataSourcePtr ds = vector->dataSource();
Comment 4 Andrew Walker 2006-01-24 20:38:20 UTC
Crash is now guarded against.