rpms/opal/F-11 opal-handlers.cxx.patch, NONE, 1.1 opal.spec, 1.49, 1.50

Peter Robinson pbrobinson at fedoraproject.org
Thu May 28 14:25:57 UTC 2009


Author: pbrobinson

Update of /cvs/pkgs/rpms/opal/F-11
In directory cvs1.fedora.phx.redhat.com:/tmp/cvs-serv4175

Modified Files:
	opal.spec 
Added Files:
	opal-handlers.cxx.patch 
Log Message:
- Add an upstream patch to fix a deadlock issue.

opal-handlers.cxx.patch:

--- NEW FILE opal-handlers.cxx.patch ---
--- opal-3.6.2/src/sip/handlers.cxx.orig	2009-05-28 12:27:34.000000000 +0100
+++ opal-3.6.2/src/sip/handlers.cxx	2009-05-28 14:02:21.000000000 +0100
@@ -1465,6 +1465,16 @@
 
 //////////////////////////////////////////////////////////////////
 
+/* All of the bwlow search loops run through the list with only
+   PSafeReference rather than PSafeReadOnly, even though they are
+   reading fields from the handler instances. We can get away with
+   this becuase the information being tested, e.g. AOR, is constant
+   for the life of the handler instance, once constructed.
+
+   We need to use PSafeReference as there are some cases where
+   deadlocks can occur when locked handlers look for information
+   from other handlers.
+ */
 unsigned SIPHandlersList::GetCount(SIP_PDU::Methods meth, const PString & eventPackage) const
 {
   unsigned count = 0;
@@ -1493,11 +1503,12 @@
 /**
  * Find the SIPHandler object with the specified callID
  */
-PSafePtr<SIPHandler> SIPHandlersList::FindSIPHandlerByCallID(const PString & callID, PSafetyMode m)
+PSafePtr<SIPHandler> SIPHandlersList::FindSIPHandlerByCallID(const PString & callID, PSafetyMode mode)
 {
-  for (PSafePtr<SIPHandler> handler(*this, m); handler != NULL; ++handler)
-    if (callID == handler->GetCallID())
+  for (PSafePtr<SIPHandler> handler(*this, PSafeReference); handler != NULL; ++handler) {
+    if (callID == handler->GetCallID() && handler.SetSafetyMode(mode))
       return handler;
+  }
   return NULL;
 }
 
@@ -1505,18 +1516,44 @@
 /**
  * Find the SIPHandler object with the specified authRealm
  */
-PSafePtr<SIPHandler> SIPHandlersList::FindSIPHandlerByAuthRealm (const PString & authRealm, const PString & userName, PSafetyMode m)
+PSafePtr<SIPHandler> SIPHandlersList::FindSIPHandlerByAuthRealm (const PString & authRealm, const PString & userName, PSafetyMode mode)
 {
-  PIPSocket::Address realmAddress;
+  PIPSocket::Address handlerRealmAddress;
+  PIPSocket::Address authRealmAddress(authRealm);
+
+  // if username is specified, look for exact matches
+  if (!userName.IsEmpty()) {
+
+    // look for a match to exact user name and realm
+    for (PSafePtr<SIPHandler> handler(*this, PSafeReference); handler != NULL; ++handler) {
+      if ( handler->GetUsername() == userName &&
+          (handler->GetRealm().IsEmpty() || handler->GetRealm() == authRealm) &&
+           handler.SetSafetyMode(mode))
+        return handler;
+    }
+
+    // look for a match to exact username and realm as hostname
+    for (PSafePtr<SIPHandler> handler(*this, PSafeReference); handler != NULL; ++handler) {
+      if (PIPSocket::GetHostAddress(handler->GetRealm(), handlerRealmAddress) &&
+          handlerRealmAddress == authRealmAddress &&
+          handler->GetUsername() == userName &&
+          handler.SetSafetyMode(mode))
+        return handler;
+    }
+  }
 
-  for (PSafePtr<SIPHandler> handler(*this, m); handler != NULL; ++handler) {
-    if (authRealm == handler->GetRealm() && (userName.IsEmpty() || userName == handler->GetUsername()))
+  // look for a match to exact realm
+  for (PSafePtr<SIPHandler> handler(*this, PSafeReference); handler != NULL; ++handler) {
+    if (handler->GetRealm() == authRealm && handler.SetSafetyMode(mode))
       return handler;
   }
-  for (PSafePtr<SIPHandler> handler(*this, m); handler != NULL; ++handler) {
-    if (PIPSocket::GetHostAddress(handler->GetRealm(), realmAddress))
-      if (realmAddress == PIPSocket::Address(authRealm) && (userName.IsEmpty() || userName == handler->GetUsername()))
-        return handler;
+
+  // look for a match to exact realm as hostname
+  for (PSafePtr<SIPHandler> handler(*this, PSafeReference); handler != NULL; ++handler) {
+    if (PIPSocket::GetHostAddress(handler->GetRealm(), handlerRealmAddress) &&
+        handlerRealmAddress == authRealmAddress &&
+        handler.SetSafetyMode(mode))
+      return handler;
   }
   return NULL;
 }
@@ -1529,24 +1566,27 @@
  * or 6001 at seconix.com when registering 6001 at seconix.com to
  * sip.seconix.com
  */
-PSafePtr<SIPHandler> SIPHandlersList::FindSIPHandlerByUrl(const PString & remoteAddress, SIP_PDU::Methods meth, PSafetyMode m)
+PSafePtr<SIPHandler> SIPHandlersList::FindSIPHandlerByUrl(const PString & remoteAddress, SIP_PDU::Methods meth, PSafetyMode mode)
 {
   SIPURL remoteURL = remoteAddress;
-  for (PSafePtr<SIPHandler> handler(*this, m); handler != NULL; ++handler) {
-    if (meth == handler->GetMethod() && remoteURL == handler->GetAddressOfRecord())
+  for (PSafePtr<SIPHandler> handler(*this, PSafeReference); handler != NULL; ++handler) {
+    if (handler->GetMethod() == meth &&
+        handler->GetAddressOfRecord() == remoteURL &&
+        handler.SetSafetyMode(mode))
       return handler;
   }
   return NULL;
 }
 
 
-PSafePtr<SIPHandler> SIPHandlersList::FindSIPHandlerByUrl(const PString & aor, SIP_PDU::Methods meth, const PString & eventPackage, PSafetyMode m)
+PSafePtr<SIPHandler> SIPHandlersList::FindSIPHandlerByUrl(const PString & aor, SIP_PDU::Methods meth, const PString & eventPackage, PSafetyMode mode)
 {
   SIPURL aorURL = aor;
-  for (PSafePtr<SIPHandler> handler(*this, m); handler != NULL; ++handler) {
-    if (meth == handler->GetMethod() &&
+  for (PSafePtr<SIPHandler> handler(*this, PSafeReference); handler != NULL; ++handler) {
+    if (handler->GetMethod() == meth &&
         handler->GetAddressOfRecord() == aorURL &&
-        handler->GetEventPackage() == eventPackage)
+        handler->GetEventPackage() == eventPackage &&
+        handler.SetSafetyMode(mode))
       return handler;
   }
   return NULL;
@@ -1558,14 +1598,14 @@
  * For example, in the above case, the name parameter
  * could be "sip.seconix.com" or "seconix.com".
  */
-PSafePtr<SIPHandler> SIPHandlersList::FindSIPHandlerByDomain(const PString & name, SIP_PDU::Methods meth, PSafetyMode m)
+PSafePtr<SIPHandler> SIPHandlersList::FindSIPHandlerByDomain(const PString & name, SIP_PDU::Methods meth, PSafetyMode mode)
 {
-  for (PSafePtr<SIPHandler> handler(*this, m); handler != NULL; ++handler) {
-
-    if ((handler->GetMethod() == meth) &&
-        (handler->GetState() != SIPHandler::Unsubscribed) &&
+  for (PSafePtr<SIPHandler> handler(*this, PSafeReference); handler != NULL; ++handler) {
+    if ( handler->GetMethod() == meth &&
+         handler->GetState() != SIPHandler::Unsubscribed &&
         (handler->GetAddressOfRecord().GetHostName() == name ||
-        handler->GetAddressOfRecord().GetHostAddress().IsEquivalent(name)))
+         handler->GetAddressOfRecord().GetHostAddress().IsEquivalent(name)) &&
+         handler.SetSafetyMode(mode))
       return handler;
   }
   return NULL;


Index: opal.spec
===================================================================
RCS file: /cvs/pkgs/rpms/opal/F-11/opal.spec,v
retrieving revision 1.49
retrieving revision 1.50
diff -u -p -r1.49 -r1.50
--- opal.spec	19 May 2009 23:19:10 -0000	1.49
+++ opal.spec	28 May 2009 14:25:27 -0000	1.50
@@ -1,7 +1,7 @@
 Name:		opal
 Summary:	Open Phone Abstraction Library
 Version:	3.6.2
-Release:	1%{?dist}
+Release:	2%{?dist}
 URL:		http://www.opalvoip.org/
 # We cannot use unmodified upstream source code because it contains the 
 # non-free iLBC codec.
@@ -10,6 +10,7 @@ URL:		http://www.opalvoip.org/
 #Source0:	ftp://ftp.gnome.org/pub/gnome/sources/%{name}/3.6/%{name}-%{version}.tar.bz2
 Source0:	%{name}-%{version}-noilbc.tar.bz2
 Patch0:		opal-3.6.1-noilbc.patch
+Patch1:         opal-handlers.cxx.patch
 License:	MPLv1.0
 Group:		System Environment/Libraries
 BuildRequires:	ptlib-devel = 2.6.2
@@ -41,6 +42,7 @@ header files for opal.
 %prep
 %setup -q 
 %patch0 -p1 -b .noilbc
+%patch1 -p1 -b .handlers
 
 %build
 %configure --prefix=/usr
@@ -75,6 +77,9 @@ rm -rf $RPM_BUILD_ROOT
 %{_libdir}/pkgconfig/opal.pc
 
 %changelog
+* Thu May 28 2009 Peter Robinson <pbrobinson at gmail.com> - 3.6.2-2
+- Add an upstream patch to fix a deadlock issue.
+
 * Tue May 19 2009 Peter Robinson <pbrobinson at gmail.com> - 3.6.2-1
 - New stable release for ekiga 3.2.1
 




More information about the scm-commits mailing list