diff options
author | unknown <pem@mysql.comhem.se> | 2004-01-08 10:37:31 +0100 |
---|---|---|
committer | unknown <pem@mysql.comhem.se> | 2004-01-08 10:37:31 +0100 |
commit | 027535733de4e0daef066d1c0a2aff489239d94f (patch) | |
tree | 4a62d68e525b14b671e42850a7847bb40a412c5b /sql/sp_rcontext.cc | |
parent | 952e2cd42af99102c74d16abc61b37e2c42055b0 (diff) | |
download | mariadb-git-027535733de4e0daef066d1c0a2aff489239d94f.tar.gz |
Fix BUG#2259: Crash after fetch from not-open cursor in stored procedure
Initialize and test properly when cleaning up, to avoid crash in some error cases.
mysql-test/r/sp-error.result:
Test case for BUG#2259
mysql-test/t/sp-error.test:
Test case for BUG#2259
sql/sp_rcontext.cc:
Cleanup in a more controlled way to avoid crashes in some error cases.
Remove unused variable.
sql/sp_rcontext.h:
Initialize member var, for cleanup tests.
Diffstat (limited to 'sql/sp_rcontext.cc')
-rw-r--r-- | sql/sp_rcontext.cc | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/sql/sp_rcontext.cc b/sql/sp_rcontext.cc index 41502618cda..225adc74a6b 100644 --- a/sql/sp_rcontext.cc +++ b/sql/sp_rcontext.cc @@ -176,10 +176,13 @@ sp_cursor::close(THD *thd) void sp_cursor::destroy() { - delete m_prot; - m_prot= NULL; - free_root(&m_mem_root, MYF(0)); - bzero((char *)&m_mem_root, sizeof(m_mem_root)); + if (m_prot) + { + delete m_prot; + m_prot= NULL; + free_root(&m_mem_root, MYF(0)); + bzero((char *)&m_mem_root, sizeof(m_mem_root)); + } m_isopen= FALSE; } @@ -190,14 +193,12 @@ sp_cursor::fetch(THD *thd, List<struct sp_pvar> *vars) sp_pvar_t *pv; MYSQL_ROW row; uint fldcount; - MYSQL_FIELD *fields= m_prot->fields; if (! m_isopen) { send_error(thd, ER_SP_CURSOR_NOT_OPEN); return -1; } - if (m_current_row == NULL) { send_error(thd, ER_SP_FETCH_NO_DATA); |