summaryrefslogtreecommitdiff
path: root/sql/sp_pcontext.h
diff options
context:
space:
mode:
authorpem@mysql.com <>2006-02-15 12:11:29 +0100
committerpem@mysql.com <>2006-02-15 12:11:29 +0100
commitcfba31dd46d6e88c0c681db5484613fcd0a4367e (patch)
tree97f622b83534adc7d26cca57df1a1978fb650e11 /sql/sp_pcontext.h
parentd67b0a6bf61060643a99654ac81183558600731c (diff)
downloadmariadb-git-cfba31dd46d6e88c0c681db5484613fcd0a4367e.tar.gz
Fixed BUG#16887: Cursor causes server segfault
The problem was a code generation bug: cpop instructions were not generated when using ITERATE back to an outer block from a context with a declared cursor; this would make it push a new cursor without popping in-between, eventually overrunning the cursor stack with a crash as the result. Fixed the calculation of how many cursors to pop (in sp_pcontext.cc: diff_cursors()), and also corrected diff_cursors() and diff_handlers() to when doing a "leave"; don't include the last context we're leaving (we are then jumping to the appropriate pop instructions).
Diffstat (limited to 'sql/sp_pcontext.h')
-rw-r--r--sql/sp_pcontext.h10
1 files changed, 7 insertions, 3 deletions
diff --git a/sql/sp_pcontext.h b/sql/sp_pcontext.h
index d1cd7b964c2..872c7c1d505 100644
--- a/sql/sp_pcontext.h
+++ b/sql/sp_pcontext.h
@@ -119,11 +119,15 @@ class sp_pcontext : public Sql_alloc
return m_parent;
}
+ /*
+ Number of handlers/cursors to pop between this context and 'ctx'.
+ If 'exclusive' is true, don't count the last block we are leaving;
+ this is used for LEAVE where we will jump to the cpop/hpop instructions.
+ */
uint
- diff_handlers(sp_pcontext *ctx);
-
+ diff_handlers(sp_pcontext *ctx, bool exclusive);
uint
- diff_cursors(sp_pcontext *ctx);
+ diff_cursors(sp_pcontext *ctx, bool exclusive);
//