From: Tor Didriksen Date: February 3 2011 12:30pm Subject: bzr commit into mysql-trunk branch (tor.didriksen:3596) Bug#59111 List-Archive: http://lists.mysql.com/commits/130314 X-Bug: 59111 Message-Id: <20110203123026.D673733B0@atum07.norway.sun.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============4085836736189593570==" --===============4085836736189593570== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///export/home/didrik/repo/trunk-bug59111-gis-crash/ based on revid:georgi.kodinov@stripped 3596 Tor Didriksen 2011-02-03 Bug #59111 gis crashes when server is compiled without performance schema The crash was due to pointer aliasing, nothing to do with perf.schema. @ sql/gcalc_slicescan.cc Use proper type for result_hook in new_slice(). Then static_cast<> before returning result (this was the bug). Cleanup some C-style casts, use reinterpret_cast instead. Move declarations closer to where they are actually needed. Remove the recursion between alloc_new_block() and new_item() @ sql/gcalc_slicescan.h Remove the recursion between alloc_new_block() and new_item() (it looked suspicious) modified: sql/gcalc_slicescan.cc sql/gcalc_slicescan.h === modified file 'sql/gcalc_slicescan.cc' --- a/sql/gcalc_slicescan.cc 2010-11-08 11:34:12 +0000 +++ b/sql/gcalc_slicescan.cc 2011-02-03 12:30:22 +0000 @@ -1,4 +1,4 @@ -/* Copyright (c) 2000, 2010 Oracle and/or its affiliates. All rights reserved. +/* Copyright (c) 2000, 2011 Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -62,15 +62,15 @@ void Gcalc_dyn_list::format_blk(void* bl } -Gcalc_dyn_list::Item *Gcalc_dyn_list::alloc_new_blk() +bool Gcalc_dyn_list::alloc_new_blk() { void *new_block= my_malloc(m_blk_size, MYF(MY_WME)); if (!new_block) - return NULL; + return true; *m_blk_hook= new_block; m_blk_hook= (void**)new_block; format_blk(new_block); - return new_item(); + return false; } @@ -260,8 +260,8 @@ Gcalc_scan_iterator::Gcalc_scan_iterator Gcalc_scan_iterator::point *Gcalc_scan_iterator::new_slice(Gcalc_scan_iterator::point *example) { - point *result= NULL; - Gcalc_dyn_list::Item **result_hook= (Gcalc_dyn_list::Item **)&result; + Gcalc_dyn_list::Item *item_result= NULL; + Gcalc_dyn_list::Item **result_hook= &item_result; while (example) { *result_hook= new_slice_point(); @@ -269,6 +269,7 @@ Gcalc_scan_iterator::point example= example->get_next(); } *result_hook= NULL; + point *result= static_cast(item_result); return result; } @@ -321,13 +322,10 @@ static inline bool slice_first(const Gca int Gcalc_scan_iterator::insert_top_point() { - point *sp= m_slice1; - Gcalc_dyn_list::Item **prev_hook= (Gcalc_dyn_list::Item **)&m_slice1; - point *sp1; point *sp0= new_slice_point(); - if (!sp0) return 1; + sp0->pi= m_cur_pi; sp0->next_pi= m_cur_pi->left; sp0->thread= m_cur_thread++; @@ -338,7 +336,8 @@ int Gcalc_scan_iterator::insert_top_poin m_event1= scev_thread; /*Now just to increase the size of m_slice0 to be same*/ - if (!(sp1= new_slice_point())) + point *sp1= new_slice_point(); + if (!sp1) return 1; sp1->next= m_slice0; m_slice0= sp1; @@ -354,15 +353,18 @@ int Gcalc_scan_iterator::insert_top_poin Binary search could probably make things faster here, but structures used aren't suitable, and the scan is usually not really long */ - for (; sp && slice_first(sp, sp0); - prev_hook= &sp->next, sp=sp->get_next()) - {} + point *sp= m_slice1; + point **prev_hook= &m_slice1; + for (; sp && slice_first(sp, sp0); sp=sp->get_next()) + { + prev_hook= reinterpret_cast(&(sp->next)); + } if (m_cur_pi->right) { m_event1= scev_two_threads; /*We have two threads so should decide which one will be first*/ - sp1= new_slice_point(); + point *sp1= new_slice_point(); if (!sp1) return 1; sp1->pi= m_cur_pi; @@ -549,7 +551,6 @@ int Gcalc_scan_iterator::add_intersectio int Gcalc_scan_iterator::find_intersections() { point *sp1= m_slice1; - Gcalc_dyn_list::Item **hook; m_n_intersections= 0; { @@ -564,7 +565,8 @@ int Gcalc_scan_iterator::find_intersecti } } - hook= (Gcalc_dyn_list::Item **)&m_intersections; + Gcalc_dyn_list::Item **hook= + reinterpret_cast(&m_intersections); bool intersections_found; point *last_possible_isc= NULL; === modified file 'sql/gcalc_slicescan.h' --- a/sql/gcalc_slicescan.h 2010-11-05 09:34:03 +0000 +++ b/sql/gcalc_slicescan.h 2011-02-03 12:30:22 +0000 @@ -1,4 +1,4 @@ -/* Copyright (c) 2000, 2010 Oracle and/or its affiliates. All rights reserved. +/* Copyright (c) 2000, 2011 Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -42,14 +42,14 @@ public: Item *new_item() { Item *result; - if (m_free) - { - result= m_free; - m_free= m_free->next; - } - else - result= alloc_new_blk(); + if (!m_free && alloc_new_blk()) + return NULL; + + DBUG_ASSERT(m_free); + result= m_free; + m_free= m_free->next; + result->next= NULL; return result; } inline void free_item(Item *item) @@ -83,7 +83,7 @@ protected: Item *m_free; Item *m_keep; - Item *alloc_new_blk(); + bool alloc_new_blk(); void format_blk(void* block); inline Item *ptr_add(Item *ptr, int n_items) { --===============4085836736189593570== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/tor.didriksen@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: tor.didriksen@stripped\ # ld569p129qe1c9yr # target_branch: file:///export/home/didrik/repo/trunk-bug59111-gis-\ # crash/ # testament_sha1: 210811860616349a191b44764abbdfb867c2486d # timestamp: 2011-02-03 13:30:26 +0100 # base_revision_id: georgi.kodinov@stripped\ # ykxq0tjd2vo3km91 # # Begin bundle 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 --===============4085836736189593570==--