From 4220e6671ed6583ba9ab9b79ffd823cf6de76edb Mon Sep 17 00:00:00 2001 From: Przemyslaw Czerpak Date: Thu, 13 Dec 2007 09:14:23 +0000 Subject: [PATCH] 2007-12-13 10:14 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl) * harbour/source/rtl/gtwvt/gtwvt.c ! fixed allocating terminal context - thanks to Enrico * harbour/contrib/hbct/token2.c + added automatic cleanup code for static data allocated by TokenInit() using hb_vmAtExit() functions * Change RestToken() to validate size of passed string * harbour/contrib/hbct/ct.prg - removed TokenExit() from CT EXIT procedure - it's not longer necessary * harbour/contrib/hbrddads/adsmgmnt.c * minor cleanup - hb_xgrab() cannot return NULL pointer --- harbour/ChangeLog | 16 ++++ harbour/contrib/hbct/ct.prg | 4 - harbour/contrib/hbct/token2.c | 120 +++++++++++++++++----------- harbour/contrib/hbrddads/adsmgmnt.c | 19 ++--- harbour/source/rtl/gtwvt/gtwvt.c | 6 +- 5 files changed, 102 insertions(+), 63 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 885247de7d..e9ef13a32a 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -8,6 +8,22 @@ 2002-12-01 13:30 UTC+0100 Foo Bar */ +2007-12-13 10:14 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl) + * harbour/source/rtl/gtwvt/gtwvt.c + ! fixed allocating terminal context - thanks to Enrico + + * harbour/contrib/hbct/token2.c + + added automatic cleanup code for static data allocated by + TokenInit() using hb_vmAtExit() functions + * Change RestToken() to validate size of passed string + + * harbour/contrib/hbct/ct.prg + - removed TokenExit() from CT EXIT procedure - it's not + longer necessary + + * harbour/contrib/hbrddads/adsmgmnt.c + * minor cleanup - hb_xgrab() cannot return NULL pointer + 2007-12-13 18:05 UTC+0800 Pritpal Bedi (pritpal@vouchcac.com) * harbour/contrib/hbrddads/adsmgmnt.c ! Fixed memory leak in HB_FUNC( ADSMGGETLOCKOWNER ) diff --git a/harbour/contrib/hbct/ct.prg b/harbour/contrib/hbct/ct.prg index cfdec653a7..78ab3dc8d9 100644 --- a/harbour/contrib/hbct/ct.prg +++ b/harbour/contrib/hbct/ct.prg @@ -142,8 +142,6 @@ return sbInitialized function CTEXIT() if sbInitialized - /* call tokenexit to release static token environment */ - tokenexit() ctcexit() sbInitialized := .F. endif @@ -153,8 +151,6 @@ return nil exit function _CTEXIT() if sbInitialized - /* call tokenexit to release static token environment */ - tokenexit() ctcexit() sbInitialized := .F. endif diff --git a/harbour/contrib/hbct/token2.c b/harbour/contrib/hbct/token2.c index 4b2ccb93aa..5b2e5d8235 100644 --- a/harbour/contrib/hbct/token2.c +++ b/harbour/contrib/hbct/token2.c @@ -62,6 +62,7 @@ #include "ct.h" +#include "hbvm.h" /* ==================================================================== */ @@ -91,8 +92,8 @@ static TOKEN_ENVIRONMENT sTokEnvNew( void ) return NULL; /* use the first element to store current length and use of token env */ - env[0].sStartPos = 0; /* 0-based index to next free, unused element */ - env[0].sEndPos = 100; /* but there are 100 elements ready for use */ + env[0].sStartPos = 0; /* 0-based index to next free, unused element */ + env[0].sEndPos = TOKEN_ENVIRONMENT_STEP; /* but there are 100 elements ready for use */ /* use second element to store actual index with tokennext() */ env[1].sStartPos = 0; /* 0-based index value that is to be used NEXT */ @@ -254,7 +255,33 @@ static const char *spcSeparatorStr = static const size_t ssSeparatorStrLen = 26; /* TODO: make thread safe */ -static TOKEN_ENVIRONMENT ssTokenEnvironment = NULL; +static TOKEN_ENVIRONMENT s_sTokenEnvironment = NULL; +static BOOL s_fInit = FALSE; + +static void sTokExit( void * cargo ) +{ + HB_SYMBOL_UNUSED( cargo ); + + if( s_sTokenEnvironment ) + { + sTokEnvDel( s_sTokenEnvironment ); + s_sTokenEnvironment = NULL; + } +} + +static void sTokSet( TOKEN_ENVIRONMENT env ) +{ + if( !s_fInit && env ) + { + hb_vmAtExit( sTokExit, NULL ); + s_fInit = TRUE; + } + + if( s_sTokenEnvironment ) + sTokEnvDel( s_sTokenEnvironment ); + + s_sTokenEnvironment = env; +} /* $DOC$ @@ -445,9 +472,7 @@ HB_FUNC( TOKENINIT ) } else { - if( ssTokenEnvironment != NULL ) - sTokEnvDel( ssTokenEnvironment ); - ssTokenEnvironment = sTokenEnvironment; + sTokSet( sTokenEnvironment ); } hb_retl( 1 ); } @@ -460,7 +485,7 @@ HB_FUNC( TOKENINIT ) if( ISCHAR( 4 ) && ISBYREF( 4 ) ) sTokenEnvironment = ( TOKEN_ENVIRONMENT ) hb_parc( 4 ); else - sTokenEnvironment = ssTokenEnvironment; + sTokenEnvironment = s_sTokenEnvironment; if( sTokenEnvironment != NULL ) { @@ -582,7 +607,7 @@ HB_FUNC( TOKENNEXT ) else { /* ... or static ? */ - if( ssTokenEnvironment == NULL ) + if( s_sTokenEnvironment == NULL ) { int iArgErrorMode = ct_getargerrormode(); @@ -595,7 +620,7 @@ HB_FUNC( TOKENNEXT ) hb_retc( NULL ); return; } - sTokenEnvironment = ssTokenEnvironment; + sTokenEnvironment = s_sTokenEnvironment; } /* nth token or next token ? */ @@ -706,7 +731,7 @@ HB_FUNC( TOKENNUM ) if( ISCHAR( 1 ) && ISBYREF( 1 ) ) sTokenEnvironment = ( TOKEN_ENVIRONMENT ) hb_parc( 1 ); else - sTokenEnvironment = ssTokenEnvironment; + sTokenEnvironment = s_sTokenEnvironment; if( ( void * ) sTokenEnvironment != NULL ) hb_retnl( sTokEnvGetCnt( sTokenEnvironment ) ); @@ -779,7 +804,7 @@ HB_FUNC( TOKENEND ) if( ISCHAR( 1 ) && ISBYREF( 1 ) ) sTokenEnvironment = ( TOKEN_ENVIRONMENT ) hb_parc( 1 ); else - sTokenEnvironment = ssTokenEnvironment; + sTokenEnvironment = s_sTokenEnvironment; if( ( void * ) sTokenEnvironment != NULL ) hb_retl( sTokEnvEnd( sTokenEnvironment ) ); @@ -843,10 +868,9 @@ HB_FUNC( TOKENEND ) HB_FUNC( TOKENEXIT ) { - if( ssTokenEnvironment != NULL ) + if( s_sTokenEnvironment != NULL ) { - sTokEnvDel( ssTokenEnvironment ); - ssTokenEnvironment = NULL; + sTokExit( NULL ); hb_retl( 1 ); } else @@ -923,7 +947,7 @@ HB_FUNC( TOKENAT ) if( ISCHAR( 3 ) && ISBYREF( 3 ) ) sTokenEnvironment = ( TOKEN_ENVIRONMENT ) hb_parc( 3 ); else - sTokenEnvironment = ssTokenEnvironment; + sTokenEnvironment = s_sTokenEnvironment; if( ( void * ) sTokenEnvironment == NULL ) { @@ -998,8 +1022,8 @@ HB_FUNC( TOKENAT ) HB_FUNC( SAVETOKEN ) { - if( ssTokenEnvironment != NULL ) - hb_retclen( ( char * ) ssTokenEnvironment, sTokEnvGetSize( ssTokenEnvironment ) ); + if( s_sTokenEnvironment != NULL ) + hb_retclen( ( char * ) s_sTokenEnvironment, sTokEnvGetSize( s_sTokenEnvironment ) ); else hb_retc( NULL ); } @@ -1040,47 +1064,47 @@ HB_FUNC( SAVETOKEN ) HB_FUNC( RESTTOKEN ) { + TOKEN_ENVIRONMENT sTokenEnvironment = NULL; + size_t sStrLen = 1; + if( ISCHAR( 1 ) ) { - char *pcString = hb_parc( 1 ); - size_t sStrLen = ( size_t ) hb_parclen( 1 ); - TOKEN_ENVIRONMENT sTokenEnvironment; - - if( sStrLen != 0 ) + sStrLen = ( size_t ) hb_parclen( 1 ); + if( sStrLen >= sizeof( TOKEN_POSITION ) ) { - /* alloc memory for new environment */ - sTokenEnvironment = ( TOKEN_ENVIRONMENT ) hb_xalloc( sStrLen ); - if( sTokenEnvironment == NULL ) + TOKEN_ENVIRONMENT env = ( TOKEN_ENVIRONMENT ) hb_parc( 1 ); + + if( sTokEnvGetSize( env ) == sStrLen ) { - int iArgErrorMode = ct_getargerrormode(); - - if( iArgErrorMode != CT_ARGERR_IGNORE ) + /* alloc memory for new environment */ + sTokenEnvironment = ( TOKEN_ENVIRONMENT ) hb_xalloc( sStrLen ); + if( sTokenEnvironment == NULL ) { - ct_error( ( USHORT ) iArgErrorMode, EG_MEM, CT_ERROR_RESTTOKEN, - NULL, "RESTTOKEN", 0, EF_CANDEFAULT, - HB_ERR_ARGS_BASEPARAMS ); - } - hb_retc( NULL ); - return; - } - hb_xmemcpy( sTokenEnvironment, pcString, sStrLen ); - } - else - { - /* restored env has length 0 */ - sTokenEnvironment = NULL; - } + int iArgErrorMode = ct_getargerrormode(); - /* return current environment, then delete it */ - if( ssTokenEnvironment != NULL ) - { - hb_retclen( ( char * ) ssTokenEnvironment, sTokEnvGetSize( ssTokenEnvironment ) ); - sTokEnvDel( ssTokenEnvironment ); + if( iArgErrorMode != CT_ARGERR_IGNORE ) + { + ct_error( ( USHORT ) iArgErrorMode, EG_MEM, CT_ERROR_RESTTOKEN, + NULL, "RESTTOKEN", 0, EF_CANDEFAULT, + HB_ERR_ARGS_BASEPARAMS ); + } + hb_retc( NULL ); + return; + } + hb_xmemcpy( sTokenEnvironment, env, sStrLen ); + } } + } + + if( sTokenEnvironment != NULL || sStrLen == 0 ) + { + /* return current environment, then delete it */ + if( s_sTokenEnvironment != NULL ) + hb_retclen( ( char * ) s_sTokenEnvironment, sTokEnvGetSize( s_sTokenEnvironment ) ); else hb_retc( NULL ); - ssTokenEnvironment = sTokenEnvironment; + sTokSet( sTokenEnvironment ); } else { diff --git a/harbour/contrib/hbrddads/adsmgmnt.c b/harbour/contrib/hbrddads/adsmgmnt.c index eb20cebea7..1668108d61 100644 --- a/harbour/contrib/hbrddads/adsmgmnt.c +++ b/harbour/contrib/hbrddads/adsmgmnt.c @@ -444,6 +444,7 @@ HB_FUNC( ADSMGGETUSERNAMES ) /* Return array of connected users */ HB_FUNC( ADSMGGETLOCKOWNER ) { + /* // UNSIGNED32 AdsMgGetLockOwner (ADSHANDLE hMgmtConnect, // UNSIGNED8 *pucTableName, // UNSIGNED32 ulRecordNumber, @@ -461,6 +462,7 @@ HB_FUNC( ADSMGGETLOCKOWNER ) // // returns the advantage error code if it fails // + */ UNSIGNED32 ulRetVal; UNSIGNED16 usStructSize = sizeof( ADS_MGMT_USER_INFO ); UNSIGNED16 pusLockType; @@ -475,19 +477,18 @@ HB_FUNC( ADSMGGETLOCKOWNER ) &pusLockType); if ( ulRetVal== AE_SUCCESS ) { - hb_reta(5); - hb_storc ( (char *) pstUserInfo->aucUserName , -1, 1); /* Machine name under NT */ - hb_stornl( (UNSIGNED16) pstUserInfo->usConnNumber, -1, 2); /* NetWare conn # (NLM only) */ - hb_storc ( (char *) pstUserInfo->aucAuthUserName, -1, 3); /* logon name with Data Dictionary */ - hb_storc ( (char *) pstUserInfo->aucAddress, -1, 4); /* IP adddress */ - hb_stornl( pusLockType, -1, 5); /* type of lock */ + hb_reta(5); + hb_storc ( (char *) pstUserInfo->aucUserName , -1, 1); /* Machine name under NT */ + hb_stornl( (UNSIGNED16) pstUserInfo->usConnNumber, -1, 2); /* NetWare conn # (NLM only) */ + hb_storc ( (char *) pstUserInfo->aucAuthUserName, -1, 3); /* logon name with Data Dictionary */ + hb_storc ( (char *) pstUserInfo->aucAddress, -1, 4); /* IP adddress */ + hb_stornl( pusLockType, -1, 5); /* type of lock */ } else { - hb_retnl( ulRetVal ); + hb_retnl( ulRetVal ); } - if ( pstUserInfo ) - hb_xfree( pstUserInfo ); + hb_xfree( pstUserInfo ); } HB_FUNC( ADSMGGETSERVERTYPE ) /* Determine OS ADS is running on; see ADS_MGMT_* constants */ diff --git a/harbour/source/rtl/gtwvt/gtwvt.c b/harbour/source/rtl/gtwvt/gtwvt.c index e46c7251b0..f408c967f3 100644 --- a/harbour/source/rtl/gtwvt/gtwvt.c +++ b/harbour/source/rtl/gtwvt/gtwvt.c @@ -132,16 +132,18 @@ static BOOL hb_gt_wvt_Alloc( PHB_GTWVT pWVT ) if( s_wvtCount < WVT_MAX_WINDOWS ) { int iPos = 0; - while( iPos < WVT_MAX_WINDOWS ) + do { if( s_wvtWindows[iPos] == NULL ) { + ++s_wvtCount; s_wvtWindows[iPos] = pWVT; pWVT->iHandle = iPos; return TRUE; } + ++iPos; } - ++iPos; + while( iPos < WVT_MAX_WINDOWS ); } return FALSE; }