connectivity/source/drivers/firebird/PreparedStatement.cxx   |    4 
 connectivity/source/drivers/firebird/StatementCommonBase.cxx |  115 ++++++-----
 connectivity/source/drivers/firebird/Util.cxx                |   14 +
 3 files changed, 76 insertions(+), 57 deletions(-)

New commits:
commit f7453024e1f46a038d1278ddcbba64ccdbf8dcd1
Author: Norbert Thiebaud <nthieb...@gmail.com>
Date:   Fri Jun 27 23:35:21 2014 +0200

    fdo#80574 firebird memory management issues
    
    Change-Id: I37438cd3f9c8e197e5a3aa3d9cbcc5bf3681d792

diff --git a/connectivity/source/drivers/firebird/PreparedStatement.cxx 
b/connectivity/source/drivers/firebird/PreparedStatement.cxx
index d5e1213..3c40ecd 100644
--- a/connectivity/source/drivers/firebird/PreparedStatement.cxx
+++ b/connectivity/source/drivers/firebird/PreparedStatement.cxx
@@ -76,7 +76,7 @@ void OPreparedStatement::ensurePrepared()
 
     if (!m_pInSqlda)
     {
-        m_pInSqlda = (XSQLDA*) malloc(XSQLDA_LENGTH(10));
+        m_pInSqlda = (XSQLDA*) calloc(1, XSQLDA_LENGTH(10));
         m_pInSqlda->version = SQLDA_VERSION1;
         m_pInSqlda->sqln = 10;
     }
@@ -99,7 +99,7 @@ void OPreparedStatement::ensurePrepared()
     {
         short nItems = m_pInSqlda->sqld;
         free(m_pInSqlda);
-        m_pInSqlda = (XSQLDA*) malloc(XSQLDA_LENGTH(nItems));
+        m_pInSqlda = (XSQLDA*) calloc(1, XSQLDA_LENGTH(nItems));
         m_pInSqlda->version = SQLDA_VERSION1;
         m_pInSqlda->sqln = nItems;
         isc_dsql_describe_bind(m_statusVector,
diff --git a/connectivity/source/drivers/firebird/StatementCommonBase.cxx 
b/connectivity/source/drivers/firebird/StatementCommonBase.cxx
index 49415fa..5daa56d 100644
--- a/connectivity/source/drivers/firebird/StatementCommonBase.cxx
+++ b/connectivity/source/drivers/firebird/StatementCommonBase.cxx
@@ -133,7 +133,7 @@ void 
OStatementCommonBase::prepareAndDescribeStatement(const OUString& sql,
 
     if (!pOutSqlda)
     {
-        pOutSqlda = (XSQLDA*) malloc(XSQLDA_LENGTH(10));
+        pOutSqlda = (XSQLDA*) calloc(1, XSQLDA_LENGTH(10));
         pOutSqlda->version = SQLDA_VERSION1;
         pOutSqlda->sqln = 10;
     }
@@ -146,68 +146,79 @@ void 
OStatementCommonBase::prepareAndDescribeStatement(const OUString& sql,
 
     if (aErr)
     {
-        free(pOutSqlda);
-        pOutSqlda = 0;
         evaluateStatusVector(m_statusVector,
                              "isc_dsql_allocate_statement",
                              *this);
     }
-
-    aErr = isc_dsql_prepare(m_statusVector,
-                            &m_pConnection->getTransaction(),
-                            &m_aStatementHandle,
-                            0,
-                            OUStringToOString(sql, 
RTL_TEXTENCODING_UTF8).getStr(),
-                            FIREBIRD_SQL_DIALECT,
-                            pInSqlda);
-
-    if (aErr)
+    else
     {
-        // TODO: free statement handle?
-        free(pOutSqlda);
-        pOutSqlda = 0;
-        evaluateStatusVector(m_statusVector,
-                             "isc_dsql_prepare",
-                             *this);
-    }
-
-    aErr = isc_dsql_describe(m_statusVector,
-                             &m_aStatementHandle,
-                             1,
-                             pOutSqlda);
+        aErr = isc_dsql_prepare(m_statusVector,
+                                &m_pConnection->getTransaction(),
+                                &m_aStatementHandle,
+                                0,
+                                OUStringToOString(sql, 
RTL_TEXTENCODING_UTF8).getStr(),
+                                FIREBIRD_SQL_DIALECT,
+                                pInSqlda);
 
+        if (aErr)
+        {
+            evaluateStatusVector(m_statusVector,
+                                 "isc_dsql_prepare",
+                                 *this);
+        }
+        else
+        {
+            aErr = isc_dsql_describe(m_statusVector,
+                                     &m_aStatementHandle,
+                                     1,
+                                     pOutSqlda);
 
-    if (aErr)
-    {
-        // TODO: free statement handle, etc.?
-        free(pOutSqlda);
-        pOutSqlda = 0;
-        evaluateStatusVector(m_statusVector,
-                             "isc_dsql_describe",
-                             *this);
+            if (aErr)
+            {
+                // TODO: free statement handle, etc.?
+                evaluateStatusVector(m_statusVector,
+                                     "isc_dsql_describe",
+                                     *this);
+            }
+            else
+            {
+                // Ensure we have enough space in pOutSqlda
+                if (pOutSqlda->sqld > pOutSqlda->sqln)
+                {
+                    int n = pOutSqlda->sqld;
+                    free(pOutSqlda);
+                    pOutSqlda = (XSQLDA*) calloc(1, XSQLDA_LENGTH(n));
+                    pOutSqlda->version = SQLDA_VERSION1;
+                    pOutSqlda->sqln = n;
+                    aErr = isc_dsql_describe(m_statusVector,
+                                             &m_aStatementHandle,
+                                             1,
+                                             pOutSqlda);
+                }
+
+                // Process each XSQLVAR parameter structure in the output 
XSQLDA
+                if (aErr)
+                {
+                    evaluateStatusVector(m_statusVector,
+                                         "isc_dsql_describe",
+                                         *this);
+                }
+                else
+                {
+                    mallocSQLVAR(pOutSqlda);
+                }
+            }
+        }
+        if(aErr)
+        {
+            freeStatementHandle();
+        }
     }
-
-    // Ensure we have enough space in pOutSqlda
-    if (pOutSqlda->sqld > pOutSqlda->sqln)
+    if(aErr)
     {
-        int n = pOutSqlda->sqld;
         free(pOutSqlda);
-        pOutSqlda = (XSQLDA*) malloc(XSQLDA_LENGTH(n));
-        pOutSqlda->version = SQLDA_VERSION1;
-        pOutSqlda->sqln = n;
-        aErr = isc_dsql_describe(m_statusVector,
-                                 &m_aStatementHandle,
-                                 1,
-                                 pOutSqlda);
+        pOutSqlda = NULL;
     }
-
-    // Process each XSQLVAR parameter structure in the output XSQLDA
-    if (aErr)
-        evaluateStatusVector(m_statusVector,
-                             "isc_dsql_describe",
-                             *this);
-
-    mallocSQLVAR(pOutSqlda);
 }
 
 // ---- XMultipleResults - UNSUPPORTED ----------------------------------------
diff --git a/connectivity/source/drivers/firebird/Util.cxx 
b/connectivity/source/drivers/firebird/Util.cxx
index 74eb00c..9a13857 100644
--- a/connectivity/source/drivers/firebird/Util.cxx
+++ b/connectivity/source/drivers/firebird/Util.cxx
@@ -271,7 +271,11 @@ void firebird::freeSQLVAR(XSQLDA* pSqlda)
         case SQL_INT64:
         case SQL_TYPE_TIME:
         case SQL_TYPE_DATE:
-            free(pVar->sqldata);
+            if(pVar->sqldata)
+            {
+                free(pVar->sqldata);
+                pVar->sqldata = NULL;
+            }
             break;
         case SQL_ARRAY:
             assert(false); // TODO: implement
@@ -284,13 +288,17 @@ void firebird::freeSQLVAR(XSQLDA* pSqlda)
             break;
         default:
             SAL_WARN("connectivity.firebird", "Unknown type: " << dtype);
-            assert(false);
+//            assert(false);
             break;
         }
 
         if (pVar->sqltype & 1)
         {
-            free(pVar->sqlind);
+            if(pVar->sqlind)
+            {
+                free(pVar->sqlind);
+                pVar->sqlind = NULL;
+            }
         }
     }
 }
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to