stmt is double-freed
This commit is contained in:
		| @ -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(); | ||||
|   /** | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 sw0
					sw0