diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2008-04-28 10:32:45 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2008-04-28 10:32:45 +0100 |
commit | 9db15748ff771cb9464742d78df56bbfb41f087d (patch) | |
tree | 947de7ecc32a9042ddfab65e5a4df29011aa127b | |
parent | f1158d65f8544fd375ea591a55c65db4f6e2a6fe (diff) |
[lwp] Beware unsigned wrap-around.
We need to restart to avoid n_ips < 2*len.
-rw-r--r-- | src/lwp.c | 7 |
1 files changed, 5 insertions, 2 deletions
@@ -663,17 +663,20 @@ _lwp_prune_recursion (gpointer *ips, guint n_ips) { guint n, len; +restart: for (len = 1; len < n_ips/2; len++) { for (n = 0; n < n_ips - 2*len; n++) { guint m = n + len; while (memcmp (ips + n, ips + m, len * sizeof (gpointer)) == 0) { - m += len; if (m + len >= n_ips) break; + m += len; } if (m != n + len) { - memmove (ips + n + len, ips + m, sizeof (gpointer) * (n_ips - m)); + memmove (ips + n + len, ips + m, + sizeof (gpointer) * (n_ips - m)); n_ips -= m - n - len; + goto restart; } } } |