소스 검색

Prevent reentrant calling of ctkProxyStyle::ensureBaseStyle()

If ctkProxyStyle::ensureBaseStyle() is already in progress for an object then further ctkProxyStyle::ensureBaseStyle() calls for the same object are ignored.
This patch is tested and does prevent the crashes. There doesn't seem to be any side-effect.
Andras Lasso 11 년 전
부모
커밋
a8ebaefdaf
1개의 변경된 파일9개의 추가작업 그리고 0개의 파일을 삭제
  1. 9 0
      Libs/Widgets/ctkProxyStyle.cpp

+ 9 - 0
Libs/Widgets/ctkProxyStyle.cpp

@@ -38,11 +38,13 @@ public:
 private:
   ctkProxyStylePrivate(ctkProxyStyle& object);
   mutable QPointer <QStyle> baseStyle;
+  mutable bool ensureBaseStyleInProgress;
 };
 
 // ----------------------------------------------------------------------------
 ctkProxyStylePrivate::ctkProxyStylePrivate(ctkProxyStyle& object)
   : q_ptr(&object)
+  , ensureBaseStyleInProgress(false)
 {
 }
 
@@ -102,6 +104,12 @@ ctkProxyStyle::~ctkProxyStyle()
 void ctkProxyStyle::ensureBaseStyle() const
 {
   Q_D(const ctkProxyStyle);
+  if (d->ensureBaseStyleInProgress)
+  {
+    // avoid infinite loop
+    return;
+  }
+  d->ensureBaseStyleInProgress = true;  
   d->baseStyle = this->baseStyle();
   // Set the proxy to the entire hierarchy.
   QProxyStyle* proxyStyle = const_cast<QProxyStyle*>(qobject_cast<const QProxyStyle*>(
@@ -115,6 +123,7 @@ void ctkProxyStyle::ensureBaseStyle() const
     baseStyle = proxy ? proxy->baseStyle() : 0;
     }
   d->setBaseStyle(proxyStyle, proxyBaseStyle);
+  d->ensureBaseStyleInProgress = false;
 }
 
 // ----------------------------------------------------------------------------