--- /dev/null
+diff -Naur libsigc++-1.2.5/sigc++/macros/signal.h.m4 libsigc++-1.2.7/sigc++/macros/signal.h.m4
+--- libsigc++-1.2.5/sigc++/macros/signal.h.m4 2003-03-06 09:06:12.000000000 +0100
++++ libsigc++-1.2.7/sigc++/macros/signal.h.m4 2005-01-29 00:10:34.000000000 +0100
+@@ -82,6 +82,8 @@
+ bool empty();
+ void clear();
+ void cleanup(); // nothrow
++ private:
++ void _remove(SignalConnectionNode* c);
+ };
+
+ class LIBSIGC_API SignalBase\r
+diff -Naur libsigc++-1.2.5/sigc++/object.h libsigc++-1.2.7/sigc++/object.h
+--- libsigc++-1.2.5/sigc++/object.h 2003-05-08 21:35:11.000000000 +0200
++++ libsigc++-1.2.7/sigc++/object.h 2012-02-14 13:08:00.193044640 +0100
+@@ -69,7 +69,7 @@
+ virtual void unreference() const;\r
+ virtual void set_manage();\r
+ \r
+- ObjectBase& operator=(const ObjectBase& /* o */)\r
++ ObjectBase& operator=(const ObjectBase& o)\r
+ { return *this; }\r
+ \r
+ ObjectBase()\r
+@@ -79,7 +79,11 @@
+ : control_(0) {}\r
+ \r
+ virtual ~ObjectBase()=0;\r
+- \r
++\r
++ Control_* control() const \r
++ { \r
++ return const_cast<ObjectBase *>(this)->control(); \r
++ }\r
+ Control_* control() \r
+ { \r
+ if (!control_) \r
+@@ -129,7 +133,6 @@
+ template <class T2>\r
+ Ptr(const Ptr<T2>& p2) \r
+ {\r
+- T* test_assignment_ = (T2*)0;\r
+ assign( p2.get() );\r
+ }\r
+ \r
+@@ -144,7 +147,7 @@
+ \r
+ template <class T2>\r
+ Ptr& operator=(const Ptr<T2>& p2)\r
+- { T *test_assignment_=(T2*)0; reset(p2.get()); return *this; }\r
++ { reset(p2.get()); return *this; }\r
+ \r
+ Ptr& operator=(const Ptr& p)\r
+ { reset(p.get()); return *this; }\r
+@@ -175,7 +178,7 @@
+ if (control_)\r
+ control_->ref();\r
+ }\r
+-\r
++ \r
+ void reset(T* t = 0)\r
+ {\r
+ if (object_ == t)\r
+@@ -197,4 +200,3 @@
+ \r
+ \r
+ #endif // SIGC_OBJECT\r
+-\r
+diff -Naur libsigc++-1.2.5/sigc++/signal.cc libsigc++-1.2.7/sigc++/signal.cc
+--- libsigc++-1.2.5/sigc++/signal.cc 2002-12-12 20:18:24.000000000 +0100
++++ libsigc++-1.2.7/sigc++/signal.cc 2005-01-29 00:10:34.000000000 +0100
+@@ -93,33 +93,11 @@
+ defered_ = false;
+
+ SignalConnectionNode* i = begin_;
+-
+- while(begin_ && begin_->defered_)
+- begin_ = begin_->next_;
+-
+- while(end_ && end_->defered_)
+- end_ = end_->prev_;
+-
+- // Hmm, this looks a bit tricky to me. The code above removes all
+- // elements from the front and the back that have defered_ = true set.
+- // But the following loop unreferences *all* defered elements, including
+- // those that are still in the list.
+- //
+- // I don't know whether this is a bug -- it's possible that defered nodes
+- // are always at the front or back. If not, a node could be unreferenced
+- // twice which is bad.
+- //
+- // --Daniel
+-
+ while(i)
+ {
+ SignalConnectionNode* next = i->next_;
+-
+ if(i->defered_)
+- {
+- i->parent_ = 0;
+- i->unreference();
+- }
++ _remove(i);
+
+ i = next;
+ }
+@@ -141,7 +119,7 @@
+ begin_->prev_=c;
+ else
+ end_=c;
+- end_=c;
++ begin_=c;
+ return c;
+ }
+
+@@ -161,21 +139,8 @@
+
+ void SignalNode::remove(SignalConnectionNode* c)
+ {
+- if (!exec_count_)
+- {
+- if (c->prev_)
+- c->prev_->next_=c->next_;
+- else
+- begin_=c->next_;
+-
+- if (c->next_)
+- c->next_->prev_=c->prev_;
+- else
+- end_=c->prev_;
+-
+- c->parent_ = 0;
+- c->unreference();
+- }
++ if(!exec_count_)
++ _remove(c);
+ else
+ {
+ c->defered_=true;
+@@ -184,6 +149,19 @@
+ }
+ }
+
++void SignalNode::_remove(SignalConnectionNode* c)
++ {
++ if (c->prev_)
++ c->prev_->next_=c->next_;
++ else
++ begin_=c->next_;
++ if (c->next_)
++ c->next_->prev_=c->prev_;
++ else
++ end_=c->prev_;
++ c->parent_ = 0;
++ c->unreference();
++ }
+
+
+ /**********************************************************/