Resource leak in wxsqlite3.cpp
Posted: Mon Sep 07, 2009 6:43 am
Hi,
Class wxSQLite3Statement (wxsqlite3.cpp) has resource leak in its operator=().
The code does not release m_stmt before assigning new value to one.
wxSQLite3Statement& wxSQLite3Statement::operator=(const wxSQLite3Statement& statement)
{
m_db = statement.m_db;
m_stmt = statement.m_stmt; // RESOURCE LEAK, must be called sqlite3_finalize(m_stmt) first!!!
// Only one object can own prepared statement
const_cast<wxSQLite3Statement&>(statement).m_stmt = 0;
return *this;
}
Take a look at similar right code.
wxSQLite3ResultSet& wxSQLite3ResultSet::operator=(const wxSQLite3ResultSet& resultSet)
{
try
{
Finalize(); // free m_stmt if owns
}
catch (...)
{
}
m_stmt = resultSet.m_stmt;
// Only one object can own the statement
const_cast<wxSQLite3ResultSet&>(resultSet).m_stmt = 0;
m_eof = resultSet.m_eof;
m_first = resultSet.m_first;
m_cols = resultSet.m_cols;
m_ownStmt = resultSet.m_ownStmt;
return *this;
}
Class wxSQLite3Statement (wxsqlite3.cpp) has resource leak in its operator=().
The code does not release m_stmt before assigning new value to one.
wxSQLite3Statement& wxSQLite3Statement::operator=(const wxSQLite3Statement& statement)
{
m_db = statement.m_db;
m_stmt = statement.m_stmt; // RESOURCE LEAK, must be called sqlite3_finalize(m_stmt) first!!!
// Only one object can own prepared statement
const_cast<wxSQLite3Statement&>(statement).m_stmt = 0;
return *this;
}
Take a look at similar right code.
wxSQLite3ResultSet& wxSQLite3ResultSet::operator=(const wxSQLite3ResultSet& resultSet)
{
try
{
Finalize(); // free m_stmt if owns
}
catch (...)
{
}
m_stmt = resultSet.m_stmt;
// Only one object can own the statement
const_cast<wxSQLite3ResultSet&>(resultSet).m_stmt = 0;
m_eof = resultSet.m_eof;
m_first = resultSet.m_first;
m_cols = resultSet.m_cols;
m_ownStmt = resultSet.m_ownStmt;
return *this;
}