don't allow allocates bigger than MAX(INTEGER)

This commit is contained in:
ceriel 1988-04-28 15:13:44 +00:00
parent 9388fb69f8
commit 0e501983f4

View file

@ -59,8 +59,12 @@ IMPLEMENTATION MODULE Storage;
VAR nu : CARDINAL; VAR nu : CARDINAL;
b : CARDINAL; b : CARDINAL;
p, q: BucketPtr; p, q: BucketPtr;
pc: POINTER TO CHAR;
brk : ADDRESS; brk : ADDRESS;
BEGIN BEGIN
IF size > CARDINAL(MAX(INTEGER)) THEN
RETURN NIL;
END;
nu := (size + (UNIT-1)) DIV UNIT; nu := (size + (UNIT-1)) DIV UNIT;
IF nu = 0 THEN IF nu = 0 THEN
RETURN NIL; RETURN NIL;
@ -72,6 +76,10 @@ IMPLEMENTATION MODULE Storage;
p := FreeLists[b]; p := FreeLists[b];
FreeLists[b] := p^.BNEXT; FreeLists[b] := p^.BNEXT;
p^.BNEXT := USED; p^.BNEXT := USED;
IF p^.BSIZE * UNIT # size THEN
pc := ADR(p^.BSTORE) + size;
pc^ := MAGICC;
END;
RETURN ADR(p^.BSTORE); RETURN ADR(p^.BSTORE);
END; END;
@ -91,6 +99,10 @@ IMPLEMENTATION MODULE Storage;
FreeLists[p^.BSIZE] := p; FreeLists[p^.BSIZE] := p;
q^.BSIZE := nu; q^.BSIZE := nu;
q^.BNEXT := USED; q^.BNEXT := USED;
IF q^.BSIZE * UNIT # size THEN
pc := ADR(q^.BSTORE) + size;
pc^ := MAGICC;
END;
RETURN ADR(q^.BSTORE); RETURN ADR(q^.BSTORE);
END; END;
END; END;
@ -122,6 +134,10 @@ IMPLEMENTATION MODULE Storage;
FreeLists[q^.BSIZE] := q; FreeLists[q^.BSIZE] := q;
p^.BSIZE := nu; p^.BSIZE := nu;
END; END;
IF p^.BSIZE * UNIT # size THEN
pc := ADR(p^.BSTORE) + size;
pc^ := MAGICC;
END;
RETURN ADR(p^.BSTORE); RETURN ADR(p^.BSTORE);
END; END;
(* Give part of tail of original block. (* Give part of tail of original block.
@ -131,6 +147,10 @@ IMPLEMENTATION MODULE Storage;
q^.BSIZE := nu; q^.BSIZE := nu;
p^.BSIZE := p^.BSIZE - nu - 1; p^.BSIZE := p^.BSIZE - nu - 1;
q^.BNEXT := USED; q^.BNEXT := USED;
IF q^.BSIZE * UNIT # size THEN
pc := ADR(q^.BSTORE) + size;
pc^ := MAGICC;
END;
RETURN ADR(q^.BSTORE); RETURN ADR(q^.BSTORE);
END; END;
END; END;
@ -152,6 +172,10 @@ IMPLEMENTATION MODULE Storage;
p := brk; p := brk;
p^.BSIZE := nu; p^.BSIZE := nu;
p^.BNEXT := USED; p^.BNEXT := USED;
IF p^.BSIZE * UNIT # size THEN
pc := ADR(p^.BSTORE) + size;
pc^ := MAGICC;
END;
RETURN ADR(p^.BSTORE); RETURN ADR(p^.BSTORE);
END MyAllocate; END MyAllocate;
@ -161,19 +185,12 @@ IMPLEMENTATION MODULE Storage;
END Allocate; END Allocate;
PROCEDURE ALLOCATE(VAR a: ADDRESS; size: CARDINAL); PROCEDURE ALLOCATE(VAR a: ADDRESS; size: CARDINAL);
VAR p: BucketPtr;
pc: POINTER TO CHAR;
BEGIN BEGIN
a := MyAllocate(size); a := MyAllocate(size);
IF a = NIL THEN IF a = NIL THEN
Message("out of core"); Message("out of core");
HALT; HALT;
END; END;
p := a - UNIT;
IF p^.BSIZE * UNIT # size THEN
pc := a + size;
pc^ := MAGICC;
END;
END ALLOCATE; END ALLOCATE;
PROCEDURE Available(size: CARDINAL): BOOLEAN; PROCEDURE Available(size: CARDINAL): BOOLEAN;
@ -212,7 +229,7 @@ IMPLEMENTATION MODULE Storage;
ELSIF (BSIZE*UNIT # size) THEN ELSIF (BSIZE*UNIT # size) THEN
pc := a + size; pc := a + size;
IF pc^ # MAGICC THEN IF pc^ # MAGICC THEN
Message("(Warning) area corrupted"); Message("(Warning) heap corrupted or wrong size in deallocate");
END; END;
END; END;
IF BSIZE <= NLISTS THEN IF BSIZE <= NLISTS THEN