diff options
author | pem@mysql.com <> | 2006-02-15 12:11:29 +0100 |
---|---|---|
committer | pem@mysql.com <> | 2006-02-15 12:11:29 +0100 |
commit | cfba31dd46d6e88c0c681db5484613fcd0a4367e (patch) | |
tree | 97f622b83534adc7d26cca57df1a1978fb650e11 /sql/sp_pcontext.h | |
parent | d67b0a6bf61060643a99654ac81183558600731c (diff) | |
download | mariadb-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.h | 10 |
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); // |