Fix deallocation which can crash if the object is half-baken.

Happens during OOM.
This commit is contained in:
Andrey Hristov 2010-05-27 08:51:46 +00:00
parent 0b9263da93
commit 4de0da5a56
2 changed files with 11 additions and 6 deletions

View file

@ -2091,16 +2091,19 @@ MYSQLND_METHOD(mysqlnd_stmt, dtor)(MYSQLND_STMT * const s, zend_bool implicit TS
{
MYSQLND_STMT_DATA * stmt = s->data;
enum_func_status ret;
zend_bool persistent = stmt->persistent;
zend_bool persistent = s->persistent;
DBG_ENTER("mysqlnd_stmt::dtor");
DBG_INF_FMT("stmt=%p", stmt);
if (stmt) {
MYSQLND_INC_GLOBAL_STATISTIC(implicit == TRUE? STAT_STMT_CLOSE_IMPLICIT:
STAT_STMT_CLOSE_EXPLICIT);
DBG_INF_FMT("stmt=%p", stmt);
ret = s->m->net_close(s, implicit TSRMLS_CC);
mnd_pefree(stmt, persistent);
MYSQLND_INC_GLOBAL_STATISTIC(implicit == TRUE? STAT_STMT_CLOSE_IMPLICIT:
STAT_STMT_CLOSE_EXPLICIT);
ret = s->m->net_close(s, implicit TSRMLS_CC);
mnd_pefree(stmt, persistent);
}
mnd_pefree(s, persistent);
DBG_INF(ret == PASS? "PASS":"FAIL");
@ -2214,6 +2217,7 @@ MYSQLND_STMT * _mysqlnd_stmt_init(MYSQLND * const conn TSRMLS_DC)
break;
}
ret->m = mysqlnd_stmt_methods;
ret->persistent = conn->persistent;
stmt = ret->data = mnd_pecalloc(1, sizeof(MYSQLND_STMT_DATA), conn->persistent);
DBG_INF_FMT("stmt=%p", stmt);

View file

@ -908,6 +908,7 @@ struct st_mysqlnd_stmt
{
MYSQLND_STMT_DATA * data;
struct st_mysqlnd_stmt_methods *m;
zend_bool persistent;
};
#endif /* MYSQLND_STRUCTS_H */