From 037ccea634ee2027c2a0caf41f5ca013050b38e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20Czerpak?= Date: Tue, 5 Apr 2016 16:27:49 +0200 Subject: [PATCH] 2016-04-05 16:27 UTC+0200 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) * contrib/hbnetio/netiosrv.c * minor optimization * src/rdd/dbcmd.c * src/rdd/wacore.c * src/rdd/wafunc.c ! added protection against exceeding the limit of workarea numbers. Current maximum is 65534, WA 65535 is reserved for internal RDD WA destructor. ! fixed possible memory leak in hb_rddInsertAreaNode() * src/vm/set.c ! fixed typo in device detection code + added NUL to list of known device names in DOS, OS2 and MS-Win builds + recognize \\\, \\.\PIPE\*, \\.\ as device names in DOS, OS2 and MS-Win builds. --- ChangeLog.txt | 18 ++++++++++++++++ contrib/hbnetio/netiosrv.c | 2 +- src/rdd/dbcmd.c | 8 +++---- src/rdd/wacore.c | 43 +++++++++++++++++++++++--------------- src/rdd/wafunc.c | 9 +++++--- src/vm/set.c | 39 ++++++++++++++++++++++++++++------ 6 files changed, 87 insertions(+), 32 deletions(-) diff --git a/ChangeLog.txt b/ChangeLog.txt index d7db4e5c7d..3c3bb2e3e6 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -10,6 +10,24 @@ * Change, ! Fix, % Optimization, + Addition, - Removal, ; Comment */ +2016-04-05 16:27 UTC+0200 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) + * contrib/hbnetio/netiosrv.c + * minor optimization + + * src/rdd/dbcmd.c + * src/rdd/wacore.c + * src/rdd/wafunc.c + ! added protection against exceeding the limit of workarea numbers. + Current maximum is 65534, WA 65535 is reserved for internal RDD + WA destructor. + ! fixed possible memory leak in hb_rddInsertAreaNode() + + * src/vm/set.c + ! fixed typo in device detection code + + added NUL to list of known device names in DOS, OS2 and MS-Win builds + + recognize \\\, \\.\PIPE\*, \\.\ as + device names in DOS, OS2 and MS-Win builds. + 2016-04-01 00:28 UTC+0200 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) * src/rtl/direct.c ! removed set of MS-Windows attributes passed unconditionally to diff --git a/contrib/hbnetio/netiosrv.c b/contrib/hbnetio/netiosrv.c index 8d74022c10..58e206e858 100644 --- a/contrib/hbnetio/netiosrv.c +++ b/contrib/hbnetio/netiosrv.c @@ -197,7 +197,7 @@ static int s_srvFileNew( PHB_CONSRV conn, PHB_FILE pFile ) { conn->filesCount++; conn->fileTable[ conn->firstFree ] = pFile; - return conn->firstFree; + return conn->firstFree++; } conn->firstFree++; } diff --git a/src/rdd/dbcmd.c b/src/rdd/dbcmd.c index ec0b0912d5..95e648a005 100644 --- a/src/rdd/dbcmd.c +++ b/src/rdd/dbcmd.c @@ -743,27 +743,25 @@ HB_FUNC( DBSELECTAREA ) if( szAlias ) { hb_rddSelectWorkAreaAlias( szAlias ); - if( hb_rddGetCurrentWorkAreaNumber() == HB_RDD_MAX_AREA_NUM ) - hb_rddSelectFirstAvailable(); } else { int iNewArea = hb_parni( 1 ); /* - * NOTE: lNewArea >= HB_RDD_MAX_AREA_NUM used intentionally + * NOTE: iNewArea >= HB_RDD_MAX_AREA_NUM used intentionally * In Clipper area 65535 is reserved for "M" alias [druzus] */ if( iNewArea < 1 || iNewArea >= HB_RDD_MAX_AREA_NUM ) { - hb_rddSelectFirstAvailable(); + if( hb_rddSelectFirstAvailable() != HB_SUCCESS ) + hb_rddSelectWorkAreaNumber( 0 ); } else { hb_rddSelectWorkAreaNumber( iNewArea ); } } - } HB_FUNC( __DBSETFOUND ) diff --git a/src/rdd/wacore.c b/src/rdd/wacore.c index 9d236facb3..e0967f7707 100644 --- a/src/rdd/wacore.c +++ b/src/rdd/wacore.c @@ -79,13 +79,10 @@ static void hb_waNodeInsert( PHB_STACKRDD pRddInfo, AREAP pArea ) iSize = HB_RDD_MAX_AREA_NUM; if( pRddInfo->uiWaNumMax == 0 ) - { pRddInfo->waNums = ( HB_USHORT * ) hb_xgrab( iSize * sizeof( HB_USHORT ) ); - } else - { pRddInfo->waNums = ( HB_USHORT * ) hb_xrealloc( pRddInfo->waNums, iSize * sizeof( HB_USHORT ) ); - } + memset( &pRddInfo->waNums[ pRddInfo->uiWaNumMax ], 0, ( iSize - pRddInfo->uiWaNumMax ) * sizeof( HB_USHORT ) ); pRddInfo->uiWaNumMax = ( HB_USHORT ) iSize; } @@ -93,9 +90,7 @@ static void hb_waNodeInsert( PHB_STACKRDD pRddInfo, AREAP pArea ) if( pRddInfo->uiWaSpace == 0 ) { pRddInfo->uiWaSpace = 256; - pRddInfo->waList = ( void ** ) hb_xgrab( pRddInfo->uiWaSpace * sizeof(void *) ); - memset( &pRddInfo->waList[ 0 ], 0, pRddInfo->uiWaSpace * sizeof(void *) ); - pRddInfo->waList[ 0 ] = NULL; + pRddInfo->waList = ( void ** ) hb_xgrabz( pRddInfo->uiWaSpace * sizeof( void * ) ); uiWaPos = 1; pRddInfo->uiWaMax = 2; } @@ -104,9 +99,14 @@ static void hb_waNodeInsert( PHB_STACKRDD pRddInfo, AREAP pArea ) uiWaPos = pRddInfo->uiWaMax++; if( pRddInfo->uiWaMax > pRddInfo->uiWaSpace ) { - pRddInfo->uiWaSpace = ( ( pRddInfo->uiWaMax + 256 ) >> 8 ) << 8; - pRddInfo->waList = ( void ** ) hb_xrealloc( pRddInfo->waList, pRddInfo->uiWaSpace * sizeof(void *) ); - memset( &pRddInfo->waList[ pRddInfo->uiWaMax ], 0, ( pRddInfo->uiWaSpace - pRddInfo->uiWaMax ) * sizeof(void *) ); + int iSize = ( ( ( int ) pRddInfo->uiWaMax + 256 ) >> 8 ) << 8; + + if( iSize > HB_RDD_MAX_AREA_NUM ) + iSize = HB_RDD_MAX_AREA_NUM; + + pRddInfo->uiWaSpace = ( HB_USHORT ) iSize; + pRddInfo->waList = ( void ** ) hb_xrealloc( pRddInfo->waList, pRddInfo->uiWaSpace * sizeof( void * ) ); + memset( &pRddInfo->waList[ pRddInfo->uiWaMax ], 0, ( pRddInfo->uiWaSpace - pRddInfo->uiWaMax ) * sizeof( void * ) ); } while( uiWaPos > 1 ) { @@ -149,9 +149,14 @@ static void hb_waNodeDelete( PHB_STACKRDD pRddInfo ) uiWaPos++; } pRddInfo->waList[ pRddInfo->uiWaMax ] = NULL; - if( pRddInfo->uiWaSpace - pRddInfo->uiWaMax >= 256 ) + if( pRddInfo->uiWaSpace - pRddInfo->uiWaMax > 256 ) { - pRddInfo->uiWaSpace = ( ( pRddInfo->uiWaMax + 256 ) >> 8 ) << 8; + int iSize = ( ( ( int ) pRddInfo->uiWaMax + 256 ) >> 8 ) << 8; + + if( iSize > HB_RDD_MAX_AREA_NUM ) + iSize = HB_RDD_MAX_AREA_NUM; + + pRddInfo->uiWaSpace = ( HB_USHORT ) iSize; pRddInfo->waList = ( void ** ) hb_xrealloc( pRddInfo->waList, pRddInfo->uiWaSpace * sizeof( void * ) ); } } @@ -203,16 +208,16 @@ HB_USHORT hb_rddInsertAreaNode( const char * szDriver ) if( ! pRddNode ) return 0; - pArea = ( AREAP ) hb_rddNewAreaNode( pRddNode, uiRddID ); - if( ! pArea ) - return 0; - if( pRddInfo->uiCurrArea == 0 ) { if( hb_rddSelectFirstAvailable() != HB_SUCCESS ) return 0; } + pArea = ( AREAP ) hb_rddNewAreaNode( pRddNode, uiRddID ); + if( ! pArea ) + return 0; + hb_waNodeInsert( pRddInfo, pArea ); return pRddInfo->uiCurrArea; @@ -527,7 +532,11 @@ static HB_GARBAGE_FUNC( hb_waHolderDestructor ) iArea = hb_rddGetCurrentWorkAreaNumber(); - hb_rddSelectFirstAvailable(); + if( hb_rddSelectFirstAvailable() != HB_SUCCESS ) + /* workarea number HB_RDD_MAX_AREA_NUM is reserved + for this destructor and used when all other workareas + are active [druzus] */ + hb_rddSelectWorkAreaNumber( HB_RDD_MAX_AREA_NUM ); hb_waNodeInsert( hb_stackRDD(), pArea ); hb_rddReleaseCurrentArea(); diff --git a/src/rdd/wafunc.c b/src/rdd/wafunc.c index 5f69125774..8a919fd228 100644 --- a/src/rdd/wafunc.c +++ b/src/rdd/wafunc.c @@ -591,13 +591,16 @@ HB_ERRCODE hb_rddOpenTable( const char * szFileName, const char * szDriver, * shares WA between threads so dbUseArea() should be covered * by external mutex to make lNewArea MT safe, [druzus] */ - if( uiArea ) + if( uiArea && uiArea < HB_RDD_MAX_AREA_NUM ) { hb_rddSelectWorkAreaNumber( uiArea ); hb_rddReleaseCurrentArea(); } - else - hb_rddSelectFirstAvailable(); + else if( hb_rddSelectFirstAvailable() != HB_SUCCESS ) + { + hb_errRT_DBCMD( EG_ARG, EDBCMD_BADPARAMETER, NULL, HB_ERR_FUNCNAME ); + return HB_FAILURE; + } /* Clipper clears NETERR flag before parameter validation, [druzus] */ diff --git a/src/vm/set.c b/src/vm/set.c index 03712f35ad..aae7aa8130 100644 --- a/src/vm/set.c +++ b/src/vm/set.c @@ -198,27 +198,54 @@ static const char * is_devicename( const char * szFileName ) { #if defined( HB_OS_OS2 ) || defined( HB_OS_WIN ) || defined( HB_OS_DOS ) const char * szDevices[] = - { "PRN", "CON", "LPT1", "LPT2", "LPT3", + { "NUL", "PRN", "CON", + "LPT1", "LPT2", "LPT3", "COM1", "COM2", "COM3", "COM4", "COM5", "COM6", "COM7", "COM8", "COM9" }; - int iLen = ( int ) strlen( szFileName ), iFrom, iTo; + int iSkip = 0, iLen, iFrom, iTo; + if( ( szFileName[ 0 ] == '\\' || szFileName[ 0 ] == '/' ) && + ( szFileName[ 1 ] == '\\' || szFileName[ 1 ] == '/' ) ) + { + if( szFileName[ 2 ] == '.' && + ( szFileName[ 3 ] == '\\' || szFileName[ 3 ] == '/' ) ) + { + iSkip = 4; + if( hb_strnicmp( szFileName + 4, "PIPE", 4 ) == 0 && + ( szFileName[ 8 ] == '\\' || szFileName[ 8 ] == '/' ) ) + return szFileName; + } + if( szFileName[ 2 ] != '\\' && szFileName[ 2 ] != '/' ) + { + for( iFrom = 2, iTo = 0; szFileName[ iFrom ]; ++iFrom ) + { + if( szFileName[ iFrom ] == '\\' || szFileName[ iFrom ] == '/' ) + { + if( iTo++ ) + break; + } + } + if( iTo == 1 ) + return szFileName; + } + } + iLen = ( int ) strlen( szFileName + iSkip ); if( iLen >= 3 && iLen <= 4 ) { if( iLen == 3 ) { iFrom = 0; - iTo = 0; + iTo = 3; } else { - iFrom = 2; + iFrom = 3; iTo = HB_SIZEOFARRAY( szDevices ); } for( ; iFrom < iTo; ++iFrom ) { - if( hb_stricmp( szFileName, szDevices[ iFrom ] ) == 0 ) - return szDevices[ iFrom ]; + if( hb_stricmp( szFileName + iSkip, szDevices[ iFrom ] ) == 0 ) + return iSkip ? szFileName : szDevices[ iFrom ]; } } #elif defined( HB_OS_UNIX )