diff --git a/harbour/ChangeLog b/harbour/ChangeLog index baeb1f1bfb..8a6e1e7c90 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -8,6 +8,22 @@ 2008-12-31 13:59 UTC+0100 Foo Bar */ +2008-08-04 22:13 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl) + * harbour/contrib/rddads/adsfunc.c + ! fixed possibly unclosed AdsCloseSQLStatement() + + * harbour/contrib/rddads/ads1.c + * minor cleanup and protection against possible strange results + caused by indexes without tags + + * harbour/source/rtl/hbinet.c + ! added protection against using wrong handles + ! fixed possible resource leak (unclosed handle) when open handle is + passed to HB_INETCONNECT[IP]() + + * harbour/source/rtl/filesys.c + * cleaned warnings + 2008-08-04 20:24 UTC+0200 Viktor Szakats (harbour.01 syenar hu) * include/hbdefs.h ! Fixed 4 remaining warnings in BCC 5.8.2 builds. diff --git a/harbour/contrib/rddads/ads1.c b/harbour/contrib/rddads/ads1.c index bf359e33cb..981f39333f 100644 --- a/harbour/contrib/rddads/ads1.c +++ b/harbour/contrib/rddads/ads1.c @@ -3356,7 +3356,7 @@ static ERRCODE adsOrderListAdd( ADSAREAP pArea, LPDBORDERINFO pOrderInfo ) ( char * ) hb_itemGetCPtr( pOrderInfo->atomBagName ), EF_CANDEFAULT ); return FAILURE; } - if( !pArea->hOrdCurrent ) + if( !pArea->hOrdCurrent && u16ArrayLen > 0 ) { pArea->hOrdCurrent = ahIndex[ 0 ]; return SELF_GOTOP( ( AREAP ) pArea ); @@ -3404,7 +3404,6 @@ static ERRCODE adsOrderListDelete( ADSAREAP pArea, LPDBORDERINFO pOrderInfo ) } } return FAILURE; - } static ERRCODE adsOrderListFocus( ADSAREAP pArea, LPDBORDERINFO pOrderInfo ) @@ -3452,6 +3451,9 @@ static ERRCODE adsOrderListFocus( ADSAREAP pArea, LPDBORDERINFO pOrderInfo ) } u32RetVal = AdsGetIndexHandleByOrder( pArea->hTable, u16Order, &hIndex ); } + else + hIndex = pArea->hOrdCurrent; + if( u32RetVal != AE_SUCCESS ) { /* ntx compatibilty: keep current order if failed */ @@ -3593,16 +3595,16 @@ static ERRCODE adsOrderCreate( ADSAREAP pArea, LPDBORDERCREATEINFO pOrderInfo ) if( fClose ) { ADSHANDLE ahIndex[ 50 ]; - UNSIGNED16 pusArrayLen = 50; + UNSIGNED16 usArrayLen = 50; u32RetVal = AdsOpenIndex( pArea->hTable, - ( UNSIGNED8 * ) pOrderInfo->abBagName, ahIndex, &pusArrayLen ); + ( UNSIGNED8 * ) pOrderInfo->abBagName, ahIndex, &usArrayLen ); if( u32RetVal != AE_SUCCESS && u32RetVal != AE_INDEX_ALREADY_OPEN ) { SELF_ORDSETCOND( ( AREAP ) pArea, NULL ); return FAILURE; } - pArea->hOrdCurrent = ahIndex[ 0 ]; + pArea->hOrdCurrent = usArrayLen ? ahIndex[ 0 ] : 0; } return SELF_GOTOP( ( AREAP ) pArea ); diff --git a/harbour/contrib/rddads/adsfunc.c b/harbour/contrib/rddads/adsfunc.c index d2be804846..f15be49d4f 100644 --- a/harbour/contrib/rddads/adsfunc.c +++ b/harbour/contrib/rddads/adsfunc.c @@ -1183,16 +1183,10 @@ HB_FUNC( ADSCREATESQLSTATEMENT ) fResult = TRUE; } else - /* QUESTION: Is this right? [vszakats] */ hb_rddReleaseCurrentArea(); } -#if 0 - /* QUESTION: Shouldn't we call AdsCloseSQLStatement() if pArea was NULL? [vszakats] */ - else - AdsCloseSQLStatement( adsStatementHandle ); -#endif } - else + if( !fResult ) AdsCloseSQLStatement( adsStatementHandle ); } } diff --git a/harbour/source/rtl/filesys.c b/harbour/source/rtl/filesys.c index 0fa3b2b9f3..5a77952ee0 100644 --- a/harbour/source/rtl/filesys.c +++ b/harbour/source/rtl/filesys.c @@ -2290,7 +2290,7 @@ HB_EXPORT USHORT hb_fsCurDirBuff( USHORT uiDrive, BYTE * pbyBuffer, ULONG ulLen { uiCurDrv = hb_fsCurDrv() + 1; if( uiDrive != uiCurDrv ) - hb_fsChDrv( ( USHORT ) ( uiDrive - 1 ) ); + hb_fsChDrv( ( BYTE ) ( uiDrive - 1 ) ); } #endif @@ -2325,7 +2325,7 @@ HB_EXPORT USHORT hb_fsCurDirBuff( USHORT uiDrive, BYTE * pbyBuffer, ULONG ulLen if( uiDrive != uiCurDrv ) { - hb_fsChDrv( ( USHORT ) ( uiCurDrv - 1 ) ); + hb_fsChDrv( ( BYTE ) ( uiCurDrv - 1 ) ); hb_fsSetError( usError ); } diff --git a/harbour/source/rtl/hbinet.c b/harbour/source/rtl/hbinet.c index 7351fb5cf9..bfc7644a83 100644 --- a/harbour/source/rtl/hbinet.c +++ b/harbour/source/rtl/hbinet.c @@ -148,13 +148,12 @@ #define HB_SOCKET_INIT( s, p ) \ do { \ s = ( HB_SOCKET_STRUCT *) hb_gcAlloc( sizeof( HB_SOCKET_STRUCT ), hb_inetSocketFinalize );\ - p = hb_itemPutPtrGC( p, s );\ - HB_SOCKET_ZERO_ERROR( s );\ + memset( s, '\0', sizeof( HB_SOCKET_STRUCT ) );\ s->com = ( HB_SOCKET_T ) -1;\ - s->count = 0;\ s->timeout = -1;\ s->timelimit = -1;\ - s->caPeriodic = NULL;\ + s->errorDesc = "";\ + p = hb_itemPutPtrGC( p, s );\ } while( 0 ) #ifndef MSG_NOSIGNAL @@ -227,6 +226,16 @@ static void hb_inetLinuxSigusrHandle( int sig ) /* JC1: we need it volatile to be minimally thread safe. */ static volatile int s_iSessions = 0; +static BOOL hb_inetIsOpen( HB_SOCKET_STRUCT *Socket ) +{ + if( Socket->com == ( HB_SOCKET_T ) -1 ) + { + HB_SOCKET_SET_ERROR2( Socket, -4, "Closed socket" ); + return FALSE; + } + return TRUE; +} + /* Useful utility function to have a timeout; */ static int hb_selectReadSocket( HB_SOCKET_STRUCT *Socket ) @@ -779,6 +788,8 @@ HB_FUNC( HB_INETGETSNDBUFSIZE ) if( Socket == NULL ) hb_errRT_BASE_SubstR( EG_ARG, 3012, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS ); + else if( !hb_inetIsOpen( Socket ) ) + hb_retni( -1 ); else { int value; @@ -788,7 +799,6 @@ HB_FUNC( HB_INETGETSNDBUFSIZE ) #else getsockopt( Socket->com, SOL_SOCKET, SO_SNDBUF, ( void * ) &value, &len ); #endif - hb_retni( value ); } } @@ -798,6 +808,8 @@ HB_FUNC( HB_INETGETRCVBUFSIZE ) if( Socket == NULL ) hb_errRT_BASE_SubstR( EG_ARG, 3012, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS ); + else if( !hb_inetIsOpen( Socket ) ) + hb_retni( -1 ); else { int value; @@ -817,6 +829,8 @@ HB_FUNC( HB_INETSETSNDBUFSIZE ) if( Socket == NULL ) hb_errRT_BASE_SubstR( EG_ARG, 3012, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS ); + else if( !hb_inetIsOpen( Socket ) ) + hb_retni( -1 ); else { int value = hb_parni( 2 ); @@ -835,6 +849,8 @@ HB_FUNC( HB_INETSETRCVBUFSIZE ) if( Socket == NULL ) hb_errRT_BASE_SubstR( EG_ARG, 3012, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS ); + else if( !hb_inetIsOpen( Socket ) ) + hb_retni( -1 ); else { int value = hb_parni( 2 ); @@ -866,6 +882,11 @@ static void s_inetRecvInternal( int iMode ) hb_errRT_BASE_SubstR( EG_ARG, 3012, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS ); return; } + else if( !hb_inetIsOpen( Socket ) ) + { + hb_retni( 0 ); + return; + } pBuffer = hb_itemUnShare( pBuffer ); buffer = hb_itemGetCPtr( pBuffer ); @@ -975,6 +996,11 @@ static void s_inetRecvPattern( char *szPattern ) hb_errRT_BASE_SubstR( EG_ARG, 3012, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS ); return; } + else if( !hb_inetIsOpen( Socket ) ) + { + hb_retni( 0 ); + return; + } if( pBufferSize ) { @@ -1131,6 +1157,13 @@ HB_FUNC( HB_INETRECVENDBLOCK ) hb_errRT_BASE_SubstR( EG_ARG, 3012, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS ); return; } + else if( !hb_inetIsOpen( Socket ) ) + { + if( pResult ) + hb_itemPutNI( pResult, -1 ); + hb_retc( NULL ); + return; + } if( pProto ) { @@ -1316,6 +1349,11 @@ HB_FUNC( HB_INETDATAREADY ) hb_errRT_BASE_SubstR( EG_ARG, 3012, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS ); return; } + else if( !hb_inetIsOpen( Socket ) ) + { + hb_retl( FALSE ); + return; + } HB_SOCKET_ZERO_ERROR( Socket ); @@ -1354,6 +1392,11 @@ static void s_inetSendInternal( int iMode ) hb_errRT_BASE_SubstR( EG_ARG, 3012, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS ); return; } + else if( !hb_inetIsOpen( Socket ) ) + { + hb_retni( 0 ); + return; + } Buffer = hb_itemGetCPtr( pBuffer ); iSend = ( int ) hb_itemGetCLen( pBuffer ); @@ -1600,6 +1643,10 @@ HB_FUNC( HB_INETACCEPT ) hb_errRT_BASE_SubstR( EG_ARG, 3012, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS ); return; } + else if( !hb_inetIsOpen( Socket ) ) + { + return; + } Len = sizeof( struct sockaddr_in ); @@ -1678,6 +1725,11 @@ HB_FUNC( HB_INETCONNECT ) if( Socket != NULL ) { + if( Socket->com != ( HB_SOCKET_T ) -1 ) + { + HB_INET_CLOSE( Socket->com ); + Socket->com = ( HB_SOCKET_T ) -1; + } HB_SOCKET_ZERO_ERROR( Socket ); } else @@ -1736,6 +1788,11 @@ HB_FUNC( HB_INETCONNECTIP ) if( Socket != NULL ) { + if( Socket->com != ( HB_SOCKET_T ) -1 ) + { + HB_INET_CLOSE( Socket->com ); + Socket->com = ( HB_SOCKET_T ) -1; + } HB_SOCKET_ZERO_ERROR( Socket ); } else @@ -1917,6 +1974,12 @@ HB_FUNC( HB_INETDGRAMSEND ) hb_errRT_BASE_SubstR( EG_ARG, 3012, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS ); return; } + else if( !hb_inetIsOpen( Socket ) ) + { + Socket->count = 0; + hb_retni( 0 ); + return; + } Socket->remote.sin_family = AF_INET; Socket->remote.sin_port = htons( iPort ); @@ -1975,6 +2038,12 @@ HB_FUNC( HB_INETDGRAMRECV ) hb_errRT_BASE_SubstR( EG_ARG, 3012, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS ); return; } + else if( !hb_inetIsOpen( Socket ) ) + { + Socket->count = 0; + hb_retni( -1 ); + return; + } pBuffer = hb_itemUnShare( pBuffer ); Buffer = hb_itemGetCPtr( pBuffer );