summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2015-10-19 00:20:33 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2015-10-19 00:20:33 +0200
commit24d74a4b5fe730cbd7ebac851665fb50c37da163 (patch)
tree62af0e5fd94107fe782d29d5bfbef182ccbb5adf
parent5ca4afb2491571cc96ba1c1a6a0bee0b1912bab5 (diff)
downloadplan9front-24d74a4b5fe730cbd7ebac851665fb50c37da163.tar.xz
acid/leak: fix endless loop for B2NB(b) == b case (thanks mischief)
-rw-r--r--sys/lib/acid/leak3
-rw-r--r--sys/lib/acid/pool9
2 files changed, 6 insertions, 6 deletions
diff --git a/sys/lib/acid/leak b/sys/lib/acid/leak
index 33b8f68b7..a4449f1a3 100644
--- a/sys/lib/acid/leak
+++ b/sys/lib/acid/leak
@@ -41,8 +41,7 @@ dumparena(arena, sum)
if nb == b then {
print("B2NB(", b\A, ") = b\n");
b = atail; // end loop
- }
- if nb > atail then {
+ } else if nb > atail then {
b = (Bhdr)(b+4);
print("lost at block ", (b-4)\A, ", scanning forward\n");
while b < atail && b.magic != ALLOC_MAGIC && b.magic != FREE_MAGIC do
diff --git a/sys/lib/acid/pool b/sys/lib/acid/pool
index 6ca5ba5cd..b00b55273 100644
--- a/sys/lib/acid/pool
+++ b/sys/lib/acid/pool
@@ -206,18 +206,19 @@ checkblock(addr)
defn
checkarena(arena)
{
- local atail, b;
+ local atail, b, nb;
atail = A2TB(arena);
complex Bhdr arena;
b = arena;
while b.magic != ARENATAIL_MAGIC && b < atail do {
checkblock(b);
- if B2NB(b) == b then {
+ nb = B2NB(b);
+ if nb == b then {
print("B2NB(", b\X, ") = b\n");
b = atail; // end loop
- }
- b = B2NB(b);
+ } else
+ b = nb;
}
checkblock(b);