mirror of https://github.com/sysown/proxysql
This patch handles local variable invalidation in 'mthd_stmt_read_all_rows' due to stack swapping because of the use of 'ma_free_root' over 'stmt' buffer.pull/3326/head
parent
6d49f5fa27
commit
42d6f9f6fd
@ -0,0 +1,29 @@
|
||||
diff --git libmariadb/mariadb_stmt.c libmariadb/mariadb_stmt.c
|
||||
index bbc2831..e66d810 100644
|
||||
--- libmariadb/mariadb_stmt.c
|
||||
+++ libmariadb/mariadb_stmt.c
|
||||
@@ -207,6 +207,24 @@ int mthd_stmt_read_all_rows(MYSQL_STMT *stmt)
|
||||
|
||||
while ((packet_len = ma_net_safe_read(stmt->mysql, &is_data_packet)) != packet_error)
|
||||
{
|
||||
+ // This change is required due to the new algorithm introduced in ProxySQL in #3295.
|
||||
+ // ********************************************************************************
|
||||
+ // DETAILS:
|
||||
+ // Since #3295 ProxySQL performs a buffering on the resulset received by a prepared
|
||||
+ // statement. This way ProxySQL doesn't require to retain the whole result of the
|
||||
+ // prepared statement in memory. For this purpose it's required to free the memory
|
||||
+ // allocated in 'MYSQL_STMT' via 'ma_free_root'. Because of this, local pointers
|
||||
+ // within this function pointing to the result data gets invalidated due to stack
|
||||
+ // swapping. Reinitializing then to the current values pointing to the new allocated
|
||||
+ // memory for 'MYSQL_STMT' is required. Since this only happens when we force
|
||||
+ // 'stmt->result.rows' to be '1', it's the only case in which these variables
|
||||
+ // need a reset.
|
||||
+ if (stmt->result.rows == 1) {
|
||||
+ result= &stmt->result;
|
||||
+ pprevious= &result->data->next;
|
||||
+ }
|
||||
+ // ********************************************************************************
|
||||
+
|
||||
p= stmt->mysql->net.read_pos;
|
||||
// The check is by 'ma_net_safe_read'
|
||||
if (p[0] == 0 || is_data_packet)
|
||||
Loading…
Reference in new issue