diff options
-rw-r--r-- | ChangeLog | 10 | ||||
-rw-r--r-- | src/edge-resistance.c | 11 |
2 files changed, 21 insertions, 0 deletions
@@ -1,5 +1,15 @@ 2007-04-03 Elijah Newren <newren gmail com> + 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 <newren gmail com> + Patch from Carlo Wood to do some miscellaneous code cleanups found while working on #358311. diff --git a/src/edge-resistance.c b/src/edge-resistance.c index 68806648..d5c60112 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) || |