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

Reply via email to