提交 bfa4cc4e 编写于 作者: S sw0 提交者: LINGuanRen

stmt is double-freed

上级 5df0c708
......@@ -338,8 +338,31 @@ ObQueryCtx* ObStmtFactory::get_query_ctx()
return query_ctx_;
}
template <>
int ObStmtFactory::create_stmt<ObSelectStmt>(ObSelectStmt*& stmt)
int ObStmtFactory::free_stmt(ObSelectStmt *stmt)
{
int ret = OB_SUCCESS;
ObObjNode<ObStmt*> *del_node = NULL;
DLIST_FOREACH_NORET(node, stmt_store_.get_obj_list()) {
if (node != NULL && node->get_obj() == stmt) {
del_node = node;
break;
}
}
if (OB_SUCC(ret)) {
if (OB_ISNULL(stmt_store_.get_obj_list().remove(del_node))) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("node is not found", K(ret));
} else if (OB_FAIL(free_list_.store_obj(stmt))) {
LOG_WARN("failed to store stmt", K(ret));
} else {
stmt->~ObSelectStmt();
}
}
return ret;
}
template<>
int ObStmtFactory::create_stmt<ObSelectStmt>(ObSelectStmt *&stmt)
{
int ret = common::OB_SUCCESS;
void* ptr = NULL;
......@@ -347,7 +370,6 @@ int ObStmtFactory::create_stmt<ObSelectStmt>(ObSelectStmt*& stmt)
ptr = allocator_.alloc(sizeof(ObSelectStmt));
} else {
stmt = free_list_.get_obj_list().remove_first()->get_obj();
stmt->~ObSelectStmt();
ptr = stmt;
}
stmt = NULL;
......
......@@ -594,17 +594,7 @@ public:
return ret;
}
inline int free_stmt(ObSelectStmt* stmt)
{
int ret = common::OB_SUCCESS;
if (OB_UNLIKELY(NULL == stmt)) {
ret = OB_ERR_UNEXPECTED;
SQL_RESV_LOG(WARN, "unexpected null");
} else if (OB_FAIL(free_list_.store_obj(stmt))) {
SQL_RESV_LOG(WARN, "store stmt failed", K(ret));
}
return ret;
}
int free_stmt(ObSelectStmt *stmt);
void destory();
/**
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册