diff --git a/ChangeLog b/ChangeLog index ecfa0a1ef..2eee01290 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2007-04-03 Elijah Newren + + Avoid some crashes when dragging windows partially offscreen. + Possible (or at least partial) fix for #353513. + + * src/edge-resistance.c (apply_edge_resistance): be more careful + about calls to find_index_of_edge_near_position() returning + possibly invalid indices. Also, add a warning comment to + find_index_of_edge_near_position(). + 2007-04-03 Elijah Newren Patch from Carlo Wood to do some miscellaneous code cleanups found diff --git a/src/edge-resistance.c b/src/edge-resistance.c index 688066487..d5c601128 100644 --- a/src/edge-resistance.c +++ b/src/edge-resistance.c @@ -62,6 +62,9 @@ struct MetaEdgeResistanceData ResistanceDataForAnEdge bottom_data; }; +/* !WARNING!: this function can return invalid indices (namely, either -1 or + * edges->len); this is by design, but you need to remember this. + */ static int find_index_of_edge_near_position (const GArray *edges, int position, @@ -330,6 +333,7 @@ apply_edge_resistance (MetaWindow *window, gboolean keyboard_op) { int i, begin, end; + int last_edge; gboolean increasing = new_pos > old_pos; int increment = increasing ? 1 : -1; @@ -366,6 +370,13 @@ apply_edge_resistance (MetaWindow *window, begin = find_index_of_edge_near_position (edges, old_pos, increasing, xdir); end = find_index_of_edge_near_position (edges, new_pos, !increasing, xdir); + /* begin and end can be outside the array index, if the window is partially + * off the screen + */ + last_edge = edges->len - 1; + begin = CLAMP (begin, 0, last_edge); + end = CLAMP (end, 0, last_edge); + /* Loop over all these edges we're moving past/to. */ i = begin; while ((increasing && i <= end) ||