summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2008-04-28 10:32:45 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2008-04-28 10:32:45 +0100
commit9db15748ff771cb9464742d78df56bbfb41f087d (patch)
tree947de7ecc32a9042ddfab65e5a4df29011aa127b
parentf1158d65f8544fd375ea591a55c65db4f6e2a6fe (diff)
[lwp] Beware unsigned wrap-around.
We need to restart to avoid n_ips < 2*len.
-rw-r--r--src/lwp.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/src/lwp.c b/src/lwp.c
index d794abe..3986595 100644
--- a/src/lwp.c
+++ b/src/lwp.c
@@ -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;
}
}
}