From 344bedfe68b1f84036b77392f6421b034aedaa09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20Czerpak?= Date: Tue, 24 Sep 2013 16:59:52 +0200 Subject: [PATCH] 2013-09-24 16:59 UTC+0200 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) * include/hbvm.h * src/vm/hvm.c * added new 7-th parameter fOverLoad to hb_vmRegisterSymbols() function. When it's TRUE then new public function symbols overload existing ones. * src/vm/runner.c ! use new fOverLoad parameter of hb_vmRegisterSymbols() function to overload existing functions (HB_HRB_BIND_OVERLOAD) instead of making local modifications in global symbol table. It fixes memory corruption when the same HRB module is reloaded with HB_HRB_BIND_OVERLOAD parameter. This was very old bug which has existed from the beginning when I added support for HB_HRB_BIND_* flags. --- ChangeLog.txt | 14 ++++++++++++++ include/hbvm.h | 2 +- src/vm/hvm.c | 17 +++++++++++++---- src/vm/runner.c | 19 ++++++------------- 4 files changed, 34 insertions(+), 18 deletions(-) diff --git a/ChangeLog.txt b/ChangeLog.txt index ae32cc0851..132dec1250 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -10,6 +10,20 @@ * Change, ! Fix, % Optimization, + Addition, - Removal, ; Comment */ +2013-09-24 16:59 UTC+0200 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) + * include/hbvm.h + * src/vm/hvm.c + * added new 7-th parameter fOverLoad to hb_vmRegisterSymbols() function. + When it's TRUE then new public function symbols overload existing ones. + + * src/vm/runner.c + ! use new fOverLoad parameter of hb_vmRegisterSymbols() function to + overload existing functions (HB_HRB_BIND_OVERLOAD) instead of making + local modifications in global symbol table. It fixes memory corruption + when the same HRB module is reloaded with HB_HRB_BIND_OVERLOAD parameter. + This was very old bug which has existed from the beginning when I added + support for HB_HRB_BIND_* flags. + 2013-09-20 15:42 UTC+0200 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) * src/rdd/dbcmd.c ! fixed dbRSelect() to be compatible with undocumented Cl*pper behavior: diff --git a/include/hbvm.h b/include/hbvm.h index 9cbc599b7e..37be398067 100644 --- a/include/hbvm.h +++ b/include/hbvm.h @@ -90,7 +90,7 @@ extern HB_EXPORT PHB_SYMB hb_vmProcessDynLibSymbols( PHB_SYMB pSymbols, HB_USHOR HB_ULONG ulID; /* module unique identifier */ } HB_SYMBOLS, * PHB_SYMBOLS; /* structure to keep track of all modules symbol tables */ - extern PHB_SYMBOLS hb_vmRegisterSymbols( PHB_SYMB pModuleSymbols, HB_USHORT uiSymbols, const char * szModuleName, HB_ULONG ulID, HB_BOOL fDynLib, HB_BOOL fClone ); + extern PHB_SYMBOLS hb_vmRegisterSymbols( PHB_SYMB pModuleSymbols, HB_USHORT uiSymbols, const char * szModuleName, HB_ULONG ulID, HB_BOOL fDynLib, HB_BOOL fClone, HB_BOOL fOverLoad ); extern HB_BOOL hb_vmLockModuleSymbols( void ); extern void hb_vmUnlockModuleSymbols( void ); extern void hb_vmFreeSymbols( PHB_SYMBOLS pSymbols ); diff --git a/src/vm/hvm.c b/src/vm/hvm.c index 3af9481dd8..247fadff0b 100644 --- a/src/vm/hvm.c +++ b/src/vm/hvm.c @@ -7841,13 +7841,14 @@ void hb_vmExitSymbolGroup( void * hDynLib ) PHB_SYMBOLS hb_vmRegisterSymbols( PHB_SYMB pModuleSymbols, HB_USHORT uiSymbols, const char * szModuleName, HB_ULONG ulID, - HB_BOOL fDynLib, HB_BOOL fClone ) + HB_BOOL fDynLib, HB_BOOL fClone, + HB_BOOL fOverLoad ) { PHB_SYMBOLS pNewSymbols; HB_BOOL fRecycled, fInitStatics = HB_FALSE; HB_USHORT ui; - HB_TRACE( HB_TR_DEBUG, ( "hb_vmRegisterSymbols(%p,%hu,%s,%lu,%d,%d)", pModuleSymbols, uiSymbols, szModuleName, ulID, ( int ) fDynLib, ( int ) fClone ) ); + HB_TRACE( HB_TR_DEBUG, ( "hb_vmRegisterSymbols(%p,%hu,%s,%lu,%d,%d,%d)", pModuleSymbols, uiSymbols, szModuleName, ulID, ( int ) fDynLib, ( int ) fClone, ( int ) fOverLoad ) ); pNewSymbols = s_ulFreeSymbols == 0 ? NULL : hb_vmFindFreeModule( pModuleSymbols, uiSymbols, szModuleName, ulID ); @@ -7972,6 +7973,13 @@ PHB_SYMBOLS hb_vmRegisterSymbols( PHB_SYMB pModuleSymbols, HB_USHORT uiSymbols, if( pDynSym ) { + if( fOverLoad && ( pSymbol->scope.value & HB_FS_LOCAL ) != 0 ) + { + /* overload existing public function */ + pDynSym->pSymbol = pSymbol; + hb_vmSetDynFunc( pDynSym ); + continue; + } pSymbol->pDynSym = pDynSym; if( pDynSym->pSymbol != pSymbol && HB_VM_ISFUNC( pDynSym->pSymbol ) && ( pDynSym->pSymbol->value.pFunPtr != pSymbol->value.pFunPtr || @@ -8033,7 +8041,8 @@ PHB_SYMB hb_vmProcessSymbols( PHB_SYMB pSymbols, HB_USHORT uiModuleSymbols, hb_vmVerifyPCodeVersion( szModuleName, uiPCodeVer ); return hb_vmRegisterSymbols( pSymbols, uiModuleSymbols, szModuleName, ulID, - s_fCloneSym, s_fCloneSym )->pModuleSymbols; + s_fCloneSym, s_fCloneSym, + HB_FALSE )->pModuleSymbols; } PHB_SYMB hb_vmProcessDynLibSymbols( PHB_SYMB pSymbols, HB_USHORT uiModuleSymbols, @@ -8044,7 +8053,7 @@ PHB_SYMB hb_vmProcessDynLibSymbols( PHB_SYMB pSymbols, HB_USHORT uiModuleSymbols hb_vmVerifyPCodeVersion( szModuleName, uiPCodeVer ); return hb_vmRegisterSymbols( pSymbols, uiModuleSymbols, szModuleName, ulID, - HB_TRUE, HB_TRUE )->pModuleSymbols; + HB_TRUE, HB_TRUE, HB_FALSE )->pModuleSymbols; } static void hb_vmReleaseLocalSymbols( void ) diff --git a/src/vm/runner.c b/src/vm/runner.c index 43075664ce..30016c5a5a 100644 --- a/src/vm/runner.c +++ b/src/vm/runner.c @@ -525,7 +525,7 @@ static PHRB_BODY hb_hrbLoad( const char * szHrbBody, HB_SIZE nBodySize, HB_USHOR if( hb_vmLockModuleSymbols() ) { - if( usBind == HB_HRB_BIND_LOCAL || usBind == HB_HRB_BIND_OVERLOAD ) + if( usBind == HB_HRB_BIND_LOCAL ) { for( ul = 0; ul < pHrbBody->ulSymbols; ul++ ) { @@ -535,24 +535,17 @@ static PHRB_BODY hb_hrbLoad( const char * szHrbBody, HB_SIZE nBodySize, HB_USHOR pDynSym = hb_dynsymFind( pSymRead[ ul ].szName ); if( pDynSym ) { - if( usBind == HB_HRB_BIND_LOCAL ) - { - /* convert public function to static one */ - pSymRead[ ul ].scope.value |= HB_FS_STATIC; - } - else - { - /* overload existing public function */ - pDynSym->pSymbol = &pSymRead[ ul ]; - hb_vmSetDynFunc( pDynSym ); - } + /* convert public function to static one */ + pSymRead[ ul ].scope.value |= HB_FS_STATIC; } } } } pHrbBody->pModuleSymbols = hb_vmRegisterSymbols( pHrbBody->pSymRead, - ( HB_USHORT ) pHrbBody->ulSymbols, szFileName ? szFileName : "pcode.hrb", 0, HB_TRUE, HB_FALSE ); + ( HB_USHORT ) pHrbBody->ulSymbols, + szFileName ? szFileName : "pcode.hrb", 0, + HB_TRUE, HB_FALSE, usBind == HB_HRB_BIND_OVERLOAD ); if( pHrbBody->pModuleSymbols->pModuleSymbols != pSymRead ) {