[PATCH v2 1/3] sql: allocate memory for index_id in VDBE

imeevma at tarantool.org imeevma at tarantool.org
Wed Apr 3 19:58:32 MSK 2019


Currently, the memory for index_id is not allocated in VDBE code
in the sql_code_drop_table() and sql_drop_index() functions. This
may lead to SEGMENTATION FAULT.

Needed for #2843
---
 src/box/sql/build.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/src/box/sql/build.c b/src/box/sql/build.c
index 7724e94..c475b34 100644
--- a/src/box/sql/build.c
+++ b/src/box/sql/build.c
@@ -1473,6 +1473,7 @@ sql_code_drop_table(struct Parse *parse_context, struct space *space,
 	 */
 	int idx_rec_reg = ++parse_context->nMem;
 	int space_id_reg = ++parse_context->nMem;
+	int index_id_reg = ++parse_context->nMem;
 	int space_id = space->def->id;
 	sqlVdbeAddOp2(v, OP_Integer, space_id, space_id_reg);
 	sqlVdbeAddOp1(v, OP_CheckViewReferences, space_id_reg);
@@ -1523,7 +1524,7 @@ sql_code_drop_table(struct Parse *parse_context, struct space *space,
 			for (uint32_t i = 1; i < index_count; ++i) {
 				sqlVdbeAddOp2(v, OP_Integer,
 						  space->index[i]->def->iid,
-						  space_id_reg + 1);
+						  index_id_reg);
 				sqlVdbeAddOp3(v, OP_MakeRecord,
 						  space_id_reg, 2, idx_rec_reg);
 				sqlVdbeAddOp2(v, OP_SDelete, BOX_INDEX_ID,
@@ -1533,7 +1534,7 @@ sql_code_drop_table(struct Parse *parse_context, struct space *space,
 					     space->index[i]->def->iid));
 			}
 		}
-		sqlVdbeAddOp2(v, OP_Integer, 0, space_id_reg + 1);
+		sqlVdbeAddOp2(v, OP_Integer, 0, index_id_reg);
 		sqlVdbeAddOp3(v, OP_MakeRecord, space_id_reg, 2,
 				  idx_rec_reg);
 		sqlVdbeAddOp2(v, OP_SDelete, BOX_INDEX_ID, idx_rec_reg);
@@ -2560,8 +2561,9 @@ sql_drop_index(struct Parse *parse_context)
 	sql_clear_stat_spaces(parse_context, table_name, index->def->name);
 	int record_reg = ++parse_context->nMem;
 	int space_id_reg = ++parse_context->nMem;
+	int index_id_reg = ++parse_context->nMem;
 	sqlVdbeAddOp2(v, OP_Integer, space->def->id, space_id_reg);
-	sqlVdbeAddOp2(v, OP_Integer, index_id, space_id_reg + 1);
+	sqlVdbeAddOp2(v, OP_Integer, index_id, index_id_reg);
 	sqlVdbeAddOp3(v, OP_MakeRecord, space_id_reg, 2, record_reg);
 	sqlVdbeAddOp2(v, OP_SDelete, BOX_INDEX_ID, record_reg);
 	sqlVdbeChangeP5(v, OPFLAG_NCHANGE);
-- 
2.7.4




More information about the Tarantool-patches mailing list