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
This commit is contained in:
Przemyslaw Czerpak
2007-12-13 09:14:23 +00:00
parent b57a417ecf
commit 4220e6671e
5 changed files with 102 additions and 63 deletions

View File

@@ -8,6 +8,22 @@
2002-12-01 13:30 UTC+0100 Foo Bar <foo.bar@foobar.org>
*/
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 )

View File

@@ -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

View File

@@ -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
{

View File

@@ -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 */

View File

@@ -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;
}