diff options
author | Elijah Newren <newren gmail com> | 2007-04-03 19:56:34 +0000 |
---|---|---|
committer | Elijah Newren <newren@src.gnome.org> | 2007-04-03 19:56:34 +0000 |
commit | 350225ea37f668fefba38c21893f921480eb2fe1 (patch) | |
tree | 3684ac54093f6c1b12eb11d1177c2664bb2c8003 | |
parent | 930c7ea270729f4e36dae6662dceee3f2825f099 (diff) | |
download | metacity-350225ea37f668fefba38c21893f921480eb2fe1.tar.gz |
Avoid some crashes when dragging windows partially offscreen. Possible (or
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().
svn path=/trunk/; revision=3147
-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) || |