don't allow allocates bigger than MAX(INTEGER)
This commit is contained in:
		
							parent
							
								
									9388fb69f8
								
							
						
					
					
						commit
						0e501983f4
					
				
					 1 changed files with 25 additions and 8 deletions
				
			
		| 
						 | 
					@ -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
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue