CVSROOT: /sources/gnash Module name: gnash Changes by: Sandro Santilli <strk> 07/05/24 11:41:00
Modified files: . : ChangeLog server : button_character_instance.cpp Log message: * server/button_character_instance.cpp: protect vector elements dereferencing by assertions. I have a segfault triggered by a new uncommitted testcase replacing buttons... CVSWeb URLs: http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.3334&r2=1.3335 http://cvs.savannah.gnu.org/viewcvs/gnash/server/button_character_instance.cpp?cvsroot=gnash&r1=1.47&r2=1.48 Patches: Index: ChangeLog =================================================================== RCS file: /sources/gnash/gnash/ChangeLog,v retrieving revision 1.3334 retrieving revision 1.3335 diff -u -b -r1.3334 -r1.3335 --- ChangeLog 24 May 2007 11:30:14 -0000 1.3334 +++ ChangeLog 24 May 2007 11:41:00 -0000 1.3335 @@ -1,5 +1,11 @@ 2007-05-24 Sandro Santilli <[EMAIL PROTECTED]> + * server/button_character_instance.cpp: protect vector + elements dereferencing by assertions. I have a segfault + triggered by a new uncommitted testcase replacing buttons... + +2007-05-24 Sandro Santilli <[EMAIL PROTECTED]> + * server/sprite_instance.{cpp,h}: remove unused sprite_instance::mouse_state typedef and member. * server/parser/BitmapMovieDefinition.h, Index: server/button_character_instance.cpp =================================================================== RCS file: /sources/gnash/gnash/server/button_character_instance.cpp,v retrieving revision 1.47 retrieving revision 1.48 diff -u -b -r1.47 -r1.48 --- server/button_character_instance.cpp 2 May 2007 07:34:35 -0000 1.47 +++ server/button_character_instance.cpp 24 May 2007 11:41:00 -0000 1.48 @@ -264,7 +264,7 @@ attachButtonInterface(*this); // check up presence Key events - for (unsigned int i = 0; i < m_def->m_button_actions.size(); i++) + for (size_t i = 0, e = m_def->m_button_actions.size(); i < e; ++i) { if (m_def->m_button_actions[i].m_conditions & 0xFE00) // check up on CondKeyPress: UB[7] { @@ -382,7 +382,7 @@ m_last_mouse_flags = IDLE; m_mouse_flags = IDLE; m_mouse_state = UP; - int r, r_num = m_record_character.size(); + size_t r, r_num = m_record_character.size(); for (r = 0; r < r_num; r++) { m_record_character[r]->restart(); @@ -399,9 +399,10 @@ matrix mat = get_world_matrix(); // Advance our relevant characters. - {for (unsigned int i = 0; i < m_def->m_button_records.size(); i++) + {for (size_t i = 0; i < m_def->m_button_records.size(); i++) { button_record& rec = m_def->m_button_records[i]; + assert(m_record_character.size() > i); if (m_record_character[i] == NULL) { continue; @@ -431,9 +432,10 @@ for (int layer=m_def->m_min_layer; layer<=m_def->m_max_layer; layer++) { - for (unsigned int i = 0; i < m_def->m_button_records.size(); i++) + for (size_t i = 0; i < m_def->m_button_records.size(); i++) { button_record& rec = m_def->m_button_records[i]; + assert(m_record_character.size() > i); if (m_record_character[i] == NULL) { continue; @@ -470,7 +472,7 @@ point p; m.transform_by_inverse(&p, point(x, y)); - {for (unsigned int i = 0; i < m_def->m_button_records.size(); i++) + {for (size_t i = 0; i < m_def->m_button_records.size(); i++) { button_record& rec = m_def->m_button_records[i]; if (rec.m_character_id < 0 || rec.m_hit_test == false) @@ -603,12 +605,12 @@ // Immediately execute all events actions (don't append to // parent's action buffer for later execution!) - for (unsigned int i = 0; i < m_def->m_button_actions.size(); i++) + for (size_t i = 0; i < m_def->m_button_actions.size(); i++) { if (m_def->m_button_actions[i].m_conditions & c) { // Matching action. - for (unsigned int j = 0; j < m_def->m_button_actions[i].m_actions.size(); j++) + for (size_t j = 0; j < m_def->m_button_actions[i].m_actions.size(); j++) { action_buffer* ab = m_def->m_button_actions[i].m_actions[j]; assert(ab); @@ -655,9 +657,10 @@ { list.clear(); - for (unsigned int i = 0; i < m_def->m_button_records.size(); i++) + for (size_t i = 0; i < m_def->m_button_records.size(); i++) { button_record& rec = m_def->m_button_records[i]; + assert(m_record_character.size() > i); if (m_record_character[i] == NULL) { continue; @@ -691,12 +694,12 @@ if (new_list.size() != old_list.size()) set_invalidated(); // something changed - unsigned int old_count = old_list.size(); - unsigned int new_count = new_list.size(); - for (unsigned int i=0; i<new_count; i++) { + size_t old_count = old_list.size(); + size_t new_count = new_list.size(); + for (size_t i=0; i<new_count; i++) { bool found=false; - for (unsigned int j=0; j<old_count; j++) { + for (size_t j=0; j<old_count; j++) { if (new_list[i] == old_list[j]) { found=true; break; @@ -718,7 +721,7 @@ button_character_instance::restart_characters(int condition) { // Restart our relevant characters - for (unsigned int i = 0; i < m_def->m_button_records.size(); i++) + for (size_t i = 0; i < m_def->m_button_records.size(); i++) { bool restart = false; button_record* rec = &m_def->m_button_records[i]; @@ -742,6 +745,7 @@ if (restart == true) { + assert(m_record_character.size() > i); m_record_character[i]->restart(); } } @@ -763,9 +767,10 @@ // TODO: Instead of using these for loops again and again, wouldn't it be a // good idea to have a generic "get_record_character()" method? - for (unsigned int i = 0; i < m_def->m_button_records.size(); i++) + for (size_t i = 0; i < m_def->m_button_records.size(); i++) { button_record& rec = m_def->m_button_records[i]; + assert(m_record_character.size() > i); if (m_record_character[i] == NULL) { continue; @@ -786,9 +791,10 @@ geometry::Range2d<float> button_character_instance::getBounds() const { - for (unsigned int i = 0; i < m_def->m_button_records.size(); i++) + for (size_t i = 0; i < m_def->m_button_records.size(); i++) { button_record& rec = m_def->m_button_records[i]; + assert(m_record_character.size() > i); if (m_record_character[i] == NULL) { continue; @@ -808,9 +814,10 @@ bool button_character_instance::pointInShape(float x, float y) const { - for (unsigned int i = 0; i < m_def->m_button_records.size(); i++) + for (size_t i = 0; i < m_def->m_button_records.size(); i++) { button_record& rec = m_def->m_button_records[i]; + assert(m_record_character.size() > i); if (m_record_character[i] == NULL) { continue; @@ -834,12 +841,12 @@ if ( ! ch ) { - int size = m_record_character.size(); + size_t size = m_record_character.size(); // See if we have a match on the button records list // TODO: Should we scan only currently visible characters // (get_active_characters) ?? - for (int i=0; i<size; i++) { + for (size_t i=0; i<size; i++) { character* child = m_record_character[i].get(); if (child->get_name() == name) return child; @@ -852,7 +859,7 @@ void button_character_instance::construct() { - int r, r_num = m_def->m_button_records.size(); + size_t r, r_num = m_def->m_button_records.size(); m_record_character.resize(r_num); for (r = 0; r < r_num; r++) _______________________________________________ Gnash-commit mailing list Gnash-commit@gnu.org http://lists.gnu.org/mailman/listinfo/gnash-commit