Hi zoran,
Reviewed the patch.
Ack.
/Neel.
On 2017/02/13 06:10 PM, Zoran Milinkovic wrote:
> src/imm/common/immpbe_dump.cc | 29 +++++++++++++++++++----------
> src/imm/immpbed/immpbe_daemon.cc | 2 ++
> 2 files changed, 21 insertions(+), 10 deletions(-)
>
>
> A static string variable sPbeFileName is double freed when exit call is
> called from 2 threads.
> The patch dynamicly allocate the variable on pbeRepositoryInit call and free
> the variable on pbeRepositoryClose call.
>
> diff --git a/src/imm/common/immpbe_dump.cc b/src/imm/common/immpbe_dump.cc
> --- a/src/imm/common/immpbe_dump.cc
> +++ b/src/imm/common/immpbe_dump.cc
> @@ -72,7 +72,7 @@ void pbeClosePrepareTrans()
> #include <sqlite3.h>
> #define STRINT_BSZ 32
>
> -static std::string sPbeFileName;
> +static std::string *sPbeFileName;
>
> #define SQL_STMT_SIZE 31
>
> @@ -598,6 +598,10 @@ void* pbeRepositoryInit(const char* file
> };
> TRACE_ENTER();
>
> + if(!sPbeFileName) {
> + sPbeFileName = new std::string;
> + }
> +
> if(!create) {goto re_attach;}
>
> /* Create a fresh Pbe-repository by dumping current imm contents to
> (local or global)
> @@ -707,7 +711,7 @@ void* pbeRepositoryInit(const char* file
>
> prepareSqlStatements(dbHandle);
>
> - sPbeFileName = std::string(filePath);
> + *sPbeFileName = std::string(filePath);
> if (localTmpDir) free(localTmpDir);
> TRACE_LEAVE();
> return (void *) dbHandle;
> @@ -799,7 +803,7 @@ void* pbeRepositoryInit(const char* file
> TRACE("Successfully executed %s", sql_tr[0]);
>
>
> - sPbeFileName = std::string(filePath); /* Avoid apend to presumed empty
> string */
> + *sPbeFileName = std::string(filePath); /* Avoid apend to presumed empty
> string */
>
> prepareSqlStatements(dbHandle);
>
> @@ -826,6 +830,11 @@ void pbeRepositoryClose(void* dbHandle)
> {
> finalizeSqlStatements();
> sqlite3_close((sqlite3 *) dbHandle);
> +
> + if(sPbeFileName) {
> + delete sPbeFileName;
> + sPbeFileName = NULL;
> + }
> }
>
> void pbeCleanTmpFiles(std::string localTmpFilename)
> @@ -1537,7 +1546,7 @@ void objectModifyDiscardAllValuesOfAttrT
> TRACE_LEAVE();
> sqlite3_close((sqlite3 *) dbHandle);
> if(badfile) {
> - discardPbeFile(sPbeFileName);
> + discardPbeFile(*sPbeFileName);
> }
> LOG_ER("Exiting (line:%u)", __LINE__);
> exit(1);
> @@ -1783,7 +1792,7 @@ void objectModifyDiscardMatchingValuesOf
> TRACE_LEAVE();
> sqlite3_close((sqlite3 *) dbHandle);
> if(badfile) {
> - discardPbeFile(sPbeFileName);
> + discardPbeFile(*sPbeFileName);
> }
>
> LOG_ER("Exiting (line:%u)", __LINE__);
> @@ -1974,7 +1983,7 @@ void objectModifyAddValuesOfAttrToPBE(vo
> bailout:
> sqlite3_close((sqlite3 *) dbHandle);
> if(badfile) {
> - discardPbeFile(sPbeFileName);
> + discardPbeFile(*sPbeFileName);
> }
> LOG_ER("Exiting (line:%u)", __LINE__);
> exit(1);
> @@ -2301,7 +2310,7 @@ void objectDeleteToPBE(std::string objec
> bailout:
> sqlite3_close((sqlite3 *) dbHandle);
> if(badfile) {
> - discardPbeFile(sPbeFileName);
> + discardPbeFile(*sPbeFileName);
> }
> LOG_ER("Exiting (line:%u)", __LINE__);
> exit(1);
> @@ -2584,7 +2593,7 @@ int verifyPbeState(SaImmHandleT immHandl
> sqlite3_free_table(result);
> sqlite3_close(dbHandle);
> if(badfile) {
> - discardPbeFile(sPbeFileName);
> + discardPbeFile(*sPbeFileName);
> }
> LOG_WA("verifyPbeState failed!");
> return 0;
> @@ -3103,7 +3112,7 @@ SaAisErrorT getCcbOutcomeFromPbe(void* d
> bailout:
> sqlite3_close(dbHandle);
> if(badfile) {
> - discardPbeFile(sPbeFileName);
> + discardPbeFile(*sPbeFileName);
> }
> LOG_ER("Exiting (line:%u)", __LINE__);
> exit(1);
> @@ -3112,7 +3121,7 @@ SaAisErrorT getCcbOutcomeFromPbe(void* d
> void fsyncPbeJournalFile()
> {
> int fd=(-1);
> - std::string globalJournalFilename(sPbeFileName);
> + std::string globalJournalFilename(*sPbeFileName);
> globalJournalFilename.append("-journal");
> fd = open(globalJournalFilename.c_str(), O_RDWR);
> if(fd != (-1)) {
> diff --git a/src/imm/immpbed/immpbe_daemon.cc
> b/src/imm/immpbed/immpbe_daemon.cc
> --- a/src/imm/immpbed/immpbe_daemon.cc
> +++ b/src/imm/immpbed/immpbe_daemon.cc
> @@ -2287,6 +2287,8 @@ void pbeDaemon(SaImmHandleT immHandle, v
> continue;
>
> LOG_ER("poll failed - %s", strerror(errno));
> + pbeRepositoryClose(sDbHandle);
> + sDbHandle = NULL;
> break;
> }
>
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, SlashDot.org! http://sdm.link/slashdot
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel