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