Fix for the ithread_mutex_unlock() logic in UpnpInit().

Thanks for Nicholas Kraft.



git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@499 119443c7-1b9e-41f8-b6fc-b9c35fce742c
This commit is contained in:
Marcelo Roberto Jimenez 2010-03-17 01:00:47 +00:00
parent 82a3114379
commit b80e888ae2
2 changed files with 90 additions and 89 deletions

View File

@ -2,6 +2,10 @@
Version 1.8.0 Version 1.8.0
******************************************************************************* *******************************************************************************
2010-03-16 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* Fix for the ithread_mutex_unlock() logic in UpnpInit().
Thanks for Nicholas Kraft.
2010-03-15 Marcelo Jimenez <mroberto(at)users.sourceforge.net> 2010-03-15 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* SF Patch Tracker [ 2962606 ] Autorenewal errors: invalid SID, * SF Patch Tracker [ 2962606 ] Autorenewal errors: invalid SID,
too-short renewal interval too-short renewal interval

View File

@ -201,54 +201,54 @@ static int GetDescDocumentAndURL(
int UpnpInit(const char *HostIP, unsigned short DestPort) int UpnpInit(const char *HostIP, unsigned short DestPort)
{ {
int retVal; int retVal = UPNP_E_SUCCESS;
ithread_mutex_lock(&gSDKInitMutex); ithread_mutex_lock(&gSDKInitMutex);
// Check if we're already initialized. /* Check if we're already initialized. */
if( UpnpSdkInit == 1 ) { if (UpnpSdkInit == 1) {
ithread_mutex_unlock(&gSDKInitMutex); retval = UPNP_E_INIT;
return UPNP_E_INIT; goto exit_function;
} }
// Perform initialization preamble. /* Perform initialization preamble. */
retVal = UpnpInitPreamble(); retVal = UpnpInitPreamble();
if( retVal != UPNP_E_SUCCESS ) { if (retVal != UPNP_E_SUCCESS) {
ithread_mutex_unlock(&gSDKInitMutex); goto exit_function;
return retVal;
} }
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__,
"UpnpInit with HostIP=%s, DestPort=%d.\n", "UpnpInit with HostIP=%s, DestPort=%d.\n",
HostIP ? HostIP : "", DestPort ); HostIP ? HostIP : "", DestPort);
// Verify HostIP, if provided, or find it ourselves. /* Verify HostIP, if provided, or find it ourselves. */
if( HostIP != NULL ) { if (HostIP != NULL) {
strncpy( gIF_IPV4, HostIP, sizeof(gIF_IPV4) ); strncpy(gIF_IPV4, HostIP, sizeof(gIF_IPV4));
} else { } else {
if( getlocalhostname( gIF_IPV4, sizeof(gIF_IPV4) ) != UPNP_E_SUCCESS ) { if( getlocalhostname( gIF_IPV4, sizeof(gIF_IPV4) ) != UPNP_E_SUCCESS ) {
return UPNP_E_INIT_FAILED; retval = UPNP_E_INIT_FAILED;
goto exit_function;
} }
} }
// Set the UpnpSdkInit flag to 1 to indicate we're sucessfully initialized. /* Set the UpnpSdkInit flag to 1 to indicate we're sucessfully initialized. */
UpnpSdkInit = 1; UpnpSdkInit = 1;
// Finish initializing the SDK. /* Finish initializing the SDK. */
retVal = UpnpInitStartServers( DestPort ); retVal = UpnpInitStartServers(DestPort);
if( retVal != UPNP_E_SUCCESS ) { if (retVal != UPNP_E_SUCCESS) {
UpnpSdkInit = 0; UpnpSdkInit = 0;
ithread_mutex_unlock( &gSDKInitMutex ); goto exit_function;
return retVal;
} }
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__,
"Host Ip: %s Host Port: %d\n", gIF_IPV4, "Host Ip: %s Host Port: %d\n", gIF_IPV4,
LOCAL_PORT_V4 ); LOCAL_PORT_V4);
ithread_mutex_unlock( &gSDKInitMutex ); exit_function:
ithread_mutex_unlock(&gSDKInitMutex);
return UPNP_E_SUCCESS; return retVal;
} }
@ -256,44 +256,42 @@ int UpnpInit2(const char *IfName, unsigned short DestPort)
{ {
int retVal; int retVal;
ithread_mutex_lock( &gSDKInitMutex ); ithread_mutex_lock(&gSDKInitMutex);
// Check if we're already initialized. /* Check if we're already initialized. */
if( UpnpSdkInit == 1 ) { if (UpnpSdkInit == 1) {
ithread_mutex_unlock( &gSDKInitMutex ); retVal = UPNP_E_INIT;
return UPNP_E_INIT; goto exit_function;
} }
// Perform initialization preamble. /* Perform initialization preamble. */
retVal = UpnpInitPreamble(); retVal = UpnpInitPreamble();
if( retVal != UPNP_E_SUCCESS ) { if (retVal != UPNP_E_SUCCESS) {
ithread_mutex_unlock( &gSDKInitMutex ); goto exit_function;
return retVal;
} }
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__,
"UpnpInit2 with IfName=%s, DestPort=%d.\n", "UpnpInit2 with IfName=%s, DestPort=%d.\n",
IfName ? IfName : "", DestPort ); IfName ? IfName : "", DestPort);
// Retrieve interface information (Addresses, index, etc). /* Retrieve interface information (Addresses, index, etc). */
retVal = UpnpGetIfInfo( IfName ); retVal = UpnpGetIfInfo( IfName );
if( retVal != UPNP_E_SUCCESS ) { if (retVal != UPNP_E_SUCCESS) {
ithread_mutex_unlock( &gSDKInitMutex ); goto exit_function;
return retVal;
} }
// Set the UpnpSdkInit flag to 1 to indicate we're sucessfully initialized. /* Set the UpnpSdkInit flag to 1 to indicate we're sucessfully initialized. */
UpnpSdkInit = 1; UpnpSdkInit = 1;
// Finish initializing the SDK. /* Finish initializing the SDK. */
retVal = UpnpInitStartServers( DestPort ); retVal = UpnpInitStartServers(DestPort);
if( retVal != UPNP_E_SUCCESS ) { if (retVal != UPNP_E_SUCCESS) {
UpnpSdkInit = 0; UpnpSdkInit = 0;
ithread_mutex_unlock( &gSDKInitMutex ); goto exit_function;
return retVal;
} }
ithread_mutex_unlock( &gSDKInitMutex ); exit_function:
ithread_mutex_unlock(&gSDKInitMutex);
return UPNP_E_SUCCESS; return UPNP_E_SUCCESS;
} }
@ -310,7 +308,7 @@ int UpnpFinish(void)
struct Handle_Info *temp; struct Handle_Info *temp;
#ifdef WIN32 #ifdef WIN32
// WSACleanup(); /*WSACleanup();*/
#endif #endif
if( UpnpSdkInit != 1 ) { if( UpnpSdkInit != 1 ) {
@ -549,7 +547,7 @@ exit_function:
return retVal; return retVal;
} }
#endif // INCLUDE_DEVICE_APIS #endif /* INCLUDE_DEVICE_APIS */
#ifdef INCLUDE_DEVICE_APIS #ifdef INCLUDE_DEVICE_APIS
@ -679,7 +677,7 @@ exit_function:
return retVal; return retVal;
} }
#endif // INCLUDE_DEVICE_APIS #endif /* INCLUDE_DEVICE_APIS */
#ifdef INCLUDE_DEVICE_APIS #ifdef INCLUDE_DEVICE_APIS
@ -879,7 +877,7 @@ int UpnpUnRegisterRootDevice(UpnpDevice_Handle Hnd)
return retVal; return retVal;
} }
#endif // INCLUDE_DEVICE_APIS #endif /* INCLUDE_DEVICE_APIS */
#ifdef INCLUDE_CLIENT_APIS #ifdef INCLUDE_CLIENT_APIS
@ -936,7 +934,7 @@ int UpnpRegisterClient(
return UPNP_E_SUCCESS; return UPNP_E_SUCCESS;
} }
#endif // INCLUDE_CLIENT_APIS #endif /* INCLUDE_CLIENT_APIS */
#ifdef INCLUDE_CLIENT_APIS #ifdef INCLUDE_CLIENT_APIS
@ -968,7 +966,7 @@ int UpnpUnRegisterClient(UpnpClient_Handle Hnd)
HandleUnlock(); HandleUnlock();
return UPNP_E_INVALID_HANDLE; return UPNP_E_INVALID_HANDLE;
} }
//clean up search list /* clean up search list */
node = ListHead( &HInfo->SsdpSearchList ); node = ListHead( &HInfo->SsdpSearchList );
while( node != NULL ) { while( node != NULL ) {
searchArg = ( SsdpSearchArg * ) node->item; searchArg = ( SsdpSearchArg * ) node->item;
@ -989,7 +987,7 @@ int UpnpUnRegisterClient(UpnpClient_Handle Hnd)
return UPNP_E_SUCCESS; return UPNP_E_SUCCESS;
} }
#endif // INCLUDE_CLIENT_APIS #endif /* INCLUDE_CLIENT_APIS */
#ifdef INCLUDE_DEVICE_APIS #ifdef INCLUDE_DEVICE_APIS
@ -1350,15 +1348,13 @@ int UpnpSearchAsync(
HandleUnlock(); HandleUnlock();
SearchByTarget( Mx, Target, ( void * )Cookie_const ); SearchByTarget( Mx, Target, ( void * )Cookie_const );
//HandleUnlock();
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Exiting UpnpSearchAsync \n" ); "Exiting UpnpSearchAsync \n" );
return UPNP_E_SUCCESS; return UPNP_E_SUCCESS;
} }
#endif // INCLUDE_CLIENT_APIS #endif /* INCLUDE_CLIENT_APIS */
#endif #endif
@ -1400,7 +1396,7 @@ int UpnpSetMaxSubscriptions(
return UPNP_E_SUCCESS; return UPNP_E_SUCCESS;
} }
#endif // INCLUDE_DEVICE_APIS #endif /* INCLUDE_DEVICE_APIS */
#ifdef INCLUDE_DEVICE_APIS #ifdef INCLUDE_DEVICE_APIS
@ -1913,7 +1909,7 @@ int UpnpAcceptSubscription(
if (UpnpSdkInit != 1) { if (UpnpSdkInit != 1) {
line = __LINE__; line = __LINE__;
ret = UPNP_E_FINISH; ret = UPNP_E_FINISH;
goto ExitFunction; goto exit_function;
} }
HandleReadLock(); HandleReadLock();
@ -1922,25 +1918,25 @@ int UpnpAcceptSubscription(
HandleUnlock(); HandleUnlock();
line = __LINE__; line = __LINE__;
ret = UPNP_E_INVALID_HANDLE; ret = UPNP_E_INVALID_HANDLE;
goto ExitFunction; goto exit_function;
} }
if (DevID == NULL) { if (DevID == NULL) {
HandleUnlock(); HandleUnlock();
line = __LINE__; line = __LINE__;
ret = UPNP_E_INVALID_PARAM; ret = UPNP_E_INVALID_PARAM;
goto ExitFunction; goto exit_function;
} }
if (ServName == NULL) { if (ServName == NULL) {
HandleUnlock(); HandleUnlock();
line = __LINE__; line = __LINE__;
ret = UPNP_E_INVALID_PARAM; ret = UPNP_E_INVALID_PARAM;
goto ExitFunction; goto exit_function;
} }
if (SubsId == NULL) { if (SubsId == NULL) {
HandleUnlock(); HandleUnlock();
line = __LINE__; line = __LINE__;
ret = UPNP_E_INVALID_PARAM; ret = UPNP_E_INVALID_PARAM;
goto ExitFunction; goto exit_function;
} }
/* Now accepts an empty state list, so the code below is commented out */ /* Now accepts an empty state list, so the code below is commented out */
#if 0 #if 0
@ -1948,7 +1944,7 @@ int UpnpAcceptSubscription(
HandleUnlock(); HandleUnlock();
line = __LINE__; line = __LINE__;
ret = UPNP_E_INVALID_PARAM; ret = UPNP_E_INVALID_PARAM;
goto ExitFunction; goto exit_function;
} }
#endif #endif
@ -1958,7 +1954,7 @@ int UpnpAcceptSubscription(
ret = genaInitNotify( ret = genaInitNotify(
Hnd, DevID, ServName, VarName, NewVal, cVariables, SubsId); Hnd, DevID, ServName, VarName, NewVal, cVariables, SubsId);
ExitFunction: exit_function:
UpnpPrintf(UPNP_ALL, API, __FILE__, line, UpnpPrintf(UPNP_ALL, API, __FILE__, line,
"Exiting UpnpAcceptSubscription, ret = %d\n", ret); "Exiting UpnpAcceptSubscription, ret = %d\n", ret);
@ -1985,7 +1981,7 @@ int UpnpAcceptSubscriptionExt(
if (UpnpSdkInit != 1) { if (UpnpSdkInit != 1) {
line = __LINE__; line = __LINE__;
ret = UPNP_E_FINISH; ret = UPNP_E_FINISH;
goto ExitFunction; goto exit_function;
} }
HandleReadLock(); HandleReadLock();
@ -1994,25 +1990,25 @@ int UpnpAcceptSubscriptionExt(
HandleUnlock(); HandleUnlock();
line = __LINE__; line = __LINE__;
ret = UPNP_E_INVALID_HANDLE; ret = UPNP_E_INVALID_HANDLE;
goto ExitFunction; goto exit_function;
} }
if (DevID == NULL) { if (DevID == NULL) {
HandleUnlock(); HandleUnlock();
line = __LINE__; line = __LINE__;
ret = UPNP_E_INVALID_PARAM; ret = UPNP_E_INVALID_PARAM;
goto ExitFunction; goto exit_function;
} }
if (ServName == NULL) { if (ServName == NULL) {
HandleUnlock(); HandleUnlock();
line = __LINE__; line = __LINE__;
ret = UPNP_E_INVALID_PARAM; ret = UPNP_E_INVALID_PARAM;
goto ExitFunction; goto exit_function;
} }
if (SubsId == NULL) { if (SubsId == NULL) {
HandleUnlock(); HandleUnlock();
line = __LINE__; line = __LINE__;
ret = UPNP_E_INVALID_PARAM; ret = UPNP_E_INVALID_PARAM;
goto ExitFunction; goto exit_function;
} }
/* Now accepts an empty state list, so the code below is commented out */ /* Now accepts an empty state list, so the code below is commented out */
#if 0 #if 0
@ -2020,7 +2016,7 @@ int UpnpAcceptSubscriptionExt(
HandleUnlock(); HandleUnlock();
line = __LINE__; line = __LINE__;
ret = UPNP_E_INVALID_PARAM; ret = UPNP_E_INVALID_PARAM;
goto ExitFunction; goto exit_function;
} }
#endif #endif
@ -2029,7 +2025,7 @@ int UpnpAcceptSubscriptionExt(
line = __LINE__; line = __LINE__;
ret = genaInitNotifyExt(Hnd, DevID, ServName, PropSet, SubsId); ret = genaInitNotifyExt(Hnd, DevID, ServName, PropSet, SubsId);
ExitFunction: exit_function:
UpnpPrintf(UPNP_ALL, API, __FILE__, line, UpnpPrintf(UPNP_ALL, API, __FILE__, line,
"Exiting UpnpAcceptSubscription, ret = %d.\n", ret); "Exiting UpnpAcceptSubscription, ret = %d.\n", ret);
@ -2645,11 +2641,12 @@ int UpnpDownloadXmlDoc(const char *url, IXML_Document **xmlDoc)
} }
//---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
// *
// UPNP-API Internal function implementation * UPNP-API Internal function implementation
// *
//---------------------------------------------------------------------------- *----------------------------------------------------------------------------
*/
#ifdef WIN32 #ifdef WIN32
@ -2661,7 +2658,7 @@ int WinsockInit()
wVersionRequested = MAKEWORD( 2, 2 ); wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData ); err = WSAStartup(wVersionRequested, &wsaData);
if ( err != 0 ) { if ( err != 0 ) {
/* Tell the user that we could not find a usable */ /* Tell the user that we could not find a usable */
/* WinSock DLL. */ /* WinSock DLL. */
@ -2788,20 +2785,20 @@ int UpnpInitThreadPools()
if (ThreadPoolInit(&gSendThreadPool, &attr) != UPNP_E_SUCCESS) { if (ThreadPoolInit(&gSendThreadPool, &attr) != UPNP_E_SUCCESS) {
ret = UPNP_E_INIT_FAILED; ret = UPNP_E_INIT_FAILED;
goto ExitFunction; goto exit_function;
} }
if (ThreadPoolInit(&gRecvThreadPool, &attr) != UPNP_E_SUCCESS) { if (ThreadPoolInit(&gRecvThreadPool, &attr) != UPNP_E_SUCCESS) {
ret = UPNP_E_INIT_FAILED; ret = UPNP_E_INIT_FAILED;
goto ExitFunction; goto exit_function;
} }
if (ThreadPoolInit(&gMiniServerThreadPool, &attr) != UPNP_E_SUCCESS) { if (ThreadPoolInit(&gMiniServerThreadPool, &attr) != UPNP_E_SUCCESS) {
ret = UPNP_E_INIT_FAILED; ret = UPNP_E_INIT_FAILED;
goto ExitFunction; goto exit_function;
} }
ExitFunction: exit_function:
if (ret != UPNP_E_SUCCESS) { if (ret != UPNP_E_SUCCESS) {
UpnpSdkInit = 0; UpnpSdkInit = 0;
UpnpFinish(); UpnpFinish();
@ -3262,16 +3259,16 @@ void UpnpThreadDistribution(struct UpnpNonblockParam *Param)
UpnpStateVarComplete_delete(Evt); UpnpStateVarComplete_delete(Evt);
break; break;
} }
#endif // EXCLUDE_SOAP == 0 #endif /* EXCLUDE_SOAP == 0 */
default: default:
break; break;
} // end of switch(Param->FunName) } /* end of switch(Param->FunName) */
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Exiting UpnpThreadDistribution \n" ); "Exiting UpnpThreadDistribution \n" );
} }
#endif // INCLUDE_CLIENT_APIS #endif /* INCLUDE_CLIENT_APIS */
/*! /*!
@ -3339,14 +3336,14 @@ Upnp_Handle_Type GetDeviceHandleInfo(
UpnpDevice_Handle *device_handle_out, UpnpDevice_Handle *device_handle_out,
struct Handle_Info **HndInfo) struct Handle_Info **HndInfo)
{ {
// Check if we've got a registered device of the address family specified. /* Check if we've got a registered device of the address family specified. */
if ((AddressFamily == AF_INET && UpnpSdkDeviceRegisteredV4 == 0) || if ((AddressFamily == AF_INET && UpnpSdkDeviceRegisteredV4 == 0) ||
(AddressFamily == AF_INET6 && UpnpSdkDeviceregisteredV6 == 0)) { (AddressFamily == AF_INET6 && UpnpSdkDeviceregisteredV6 == 0)) {
*device_handle_out = -1; *device_handle_out = -1;
return HND_INVALID; return HND_INVALID;
} }
// Find it. /* Find it. */
for (*device_handle_out=1; *device_handle_out < NUM_HANDLE; (*device_handle_out)++) { for (*device_handle_out=1; *device_handle_out < NUM_HANDLE; (*device_handle_out)++) {
if (GetHandleInfo(*device_handle_out, HndInfo) == HND_DEVICE) { if (GetHandleInfo(*device_handle_out, HndInfo) == HND_DEVICE) {
if ((*HndInfo)->DeviceAf == AddressFamily) { if ((*HndInfo)->DeviceAf == AddressFamily) {
@ -3428,7 +3425,7 @@ int PrintHandleInfo(UpnpClient_Handle Hnd)
if(HndInfo->HType != HND_CLIENT) if(HndInfo->HType != HND_CLIENT)
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"DescURL_%s\n", HndInfo->DescURL ); "DescURL_%s\n", HndInfo->DescURL );
#endif #endif /* INCLUDE_DEVICE_APIS */
} else { } else {
return UPNP_E_INVALID_HANDLE; return UPNP_E_INVALID_HANDLE;
} }
@ -3798,7 +3795,7 @@ int UpnpEnableWebserver(int enable)
bWebServerState = WEB_SERVER_DISABLED; bWebServerState = WEB_SERVER_DISABLED;
SetHTTPGetCallback( NULL ); SetHTTPGetCallback( NULL );
break; break;
#endif #endif /* INTERNAL_WEB_SERVER */
default: default:
return UPNP_E_INVALID_PARAM; return UPNP_E_INVALID_PARAM;
} }