Kaydet (Commit) f7453024 authored tarafından Norbert Thiebaud's avatar Norbert Thiebaud

fdo#80574 firebird memory management issues

Change-Id: I37438cd3f9c8e197e5a3aa3d9cbcc5bf3681d792
üst 939ce4af
...@@ -76,7 +76,7 @@ void OPreparedStatement::ensurePrepared() ...@@ -76,7 +76,7 @@ void OPreparedStatement::ensurePrepared()
if (!m_pInSqlda) 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->version = SQLDA_VERSION1;
m_pInSqlda->sqln = 10; m_pInSqlda->sqln = 10;
} }
...@@ -99,7 +99,7 @@ void OPreparedStatement::ensurePrepared() ...@@ -99,7 +99,7 @@ void OPreparedStatement::ensurePrepared()
{ {
short nItems = m_pInSqlda->sqld; short nItems = m_pInSqlda->sqld;
free(m_pInSqlda); 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->version = SQLDA_VERSION1;
m_pInSqlda->sqln = nItems; m_pInSqlda->sqln = nItems;
isc_dsql_describe_bind(m_statusVector, isc_dsql_describe_bind(m_statusVector,
......
...@@ -133,7 +133,7 @@ void OStatementCommonBase::prepareAndDescribeStatement(const OUString& sql, ...@@ -133,7 +133,7 @@ void OStatementCommonBase::prepareAndDescribeStatement(const OUString& sql,
if (!pOutSqlda) if (!pOutSqlda)
{ {
pOutSqlda = (XSQLDA*) malloc(XSQLDA_LENGTH(10)); pOutSqlda = (XSQLDA*) calloc(1, XSQLDA_LENGTH(10));
pOutSqlda->version = SQLDA_VERSION1; pOutSqlda->version = SQLDA_VERSION1;
pOutSqlda->sqln = 10; pOutSqlda->sqln = 10;
} }
...@@ -146,13 +146,12 @@ void OStatementCommonBase::prepareAndDescribeStatement(const OUString& sql, ...@@ -146,13 +146,12 @@ void OStatementCommonBase::prepareAndDescribeStatement(const OUString& sql,
if (aErr) if (aErr)
{ {
free(pOutSqlda);
pOutSqlda = 0;
evaluateStatusVector(m_statusVector, evaluateStatusVector(m_statusVector,
"isc_dsql_allocate_statement", "isc_dsql_allocate_statement",
*this); *this);
} }
else
{
aErr = isc_dsql_prepare(m_statusVector, aErr = isc_dsql_prepare(m_statusVector,
&m_pConnection->getTransaction(), &m_pConnection->getTransaction(),
&m_aStatementHandle, &m_aStatementHandle,
...@@ -163,36 +162,32 @@ void OStatementCommonBase::prepareAndDescribeStatement(const OUString& sql, ...@@ -163,36 +162,32 @@ void OStatementCommonBase::prepareAndDescribeStatement(const OUString& sql,
if (aErr) if (aErr)
{ {
// TODO: free statement handle?
free(pOutSqlda);
pOutSqlda = 0;
evaluateStatusVector(m_statusVector, evaluateStatusVector(m_statusVector,
"isc_dsql_prepare", "isc_dsql_prepare",
*this); *this);
} }
else
{
aErr = isc_dsql_describe(m_statusVector, aErr = isc_dsql_describe(m_statusVector,
&m_aStatementHandle, &m_aStatementHandle,
1, 1,
pOutSqlda); pOutSqlda);
if (aErr) if (aErr)
{ {
// TODO: free statement handle, etc.? // TODO: free statement handle, etc.?
free(pOutSqlda);
pOutSqlda = 0;
evaluateStatusVector(m_statusVector, evaluateStatusVector(m_statusVector,
"isc_dsql_describe", "isc_dsql_describe",
*this); *this);
} }
else
{
// Ensure we have enough space in pOutSqlda // Ensure we have enough space in pOutSqlda
if (pOutSqlda->sqld > pOutSqlda->sqln) if (pOutSqlda->sqld > pOutSqlda->sqln)
{ {
int n = pOutSqlda->sqld; int n = pOutSqlda->sqld;
free(pOutSqlda); free(pOutSqlda);
pOutSqlda = (XSQLDA*) malloc(XSQLDA_LENGTH(n)); pOutSqlda = (XSQLDA*) calloc(1, XSQLDA_LENGTH(n));
pOutSqlda->version = SQLDA_VERSION1; pOutSqlda->version = SQLDA_VERSION1;
pOutSqlda->sqln = n; pOutSqlda->sqln = n;
aErr = isc_dsql_describe(m_statusVector, aErr = isc_dsql_describe(m_statusVector,
...@@ -203,11 +198,27 @@ void OStatementCommonBase::prepareAndDescribeStatement(const OUString& sql, ...@@ -203,11 +198,27 @@ void OStatementCommonBase::prepareAndDescribeStatement(const OUString& sql,
// Process each XSQLVAR parameter structure in the output XSQLDA // Process each XSQLVAR parameter structure in the output XSQLDA
if (aErr) if (aErr)
{
evaluateStatusVector(m_statusVector, evaluateStatusVector(m_statusVector,
"isc_dsql_describe", "isc_dsql_describe",
*this); *this);
}
else
{
mallocSQLVAR(pOutSqlda); mallocSQLVAR(pOutSqlda);
}
}
}
if(aErr)
{
freeStatementHandle();
}
}
if(aErr)
{
free(pOutSqlda);
pOutSqlda = NULL;
}
} }
// ---- XMultipleResults - UNSUPPORTED ---------------------------------------- // ---- XMultipleResults - UNSUPPORTED ----------------------------------------
......
...@@ -271,7 +271,11 @@ void firebird::freeSQLVAR(XSQLDA* pSqlda) ...@@ -271,7 +271,11 @@ void firebird::freeSQLVAR(XSQLDA* pSqlda)
case SQL_INT64: case SQL_INT64:
case SQL_TYPE_TIME: case SQL_TYPE_TIME:
case SQL_TYPE_DATE: case SQL_TYPE_DATE:
if(pVar->sqldata)
{
free(pVar->sqldata); free(pVar->sqldata);
pVar->sqldata = NULL;
}
break; break;
case SQL_ARRAY: case SQL_ARRAY:
assert(false); // TODO: implement assert(false); // TODO: implement
...@@ -284,13 +288,17 @@ void firebird::freeSQLVAR(XSQLDA* pSqlda) ...@@ -284,13 +288,17 @@ void firebird::freeSQLVAR(XSQLDA* pSqlda)
break; break;
default: default:
SAL_WARN("connectivity.firebird", "Unknown type: " << dtype); SAL_WARN("connectivity.firebird", "Unknown type: " << dtype);
assert(false); // assert(false);
break; break;
} }
if (pVar->sqltype & 1) if (pVar->sqltype & 1)
{
if(pVar->sqlind)
{ {
free(pVar->sqlind); free(pVar->sqlind);
pVar->sqlind = NULL;
}
} }
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment