Просмотр исходного кода

an improvement of the system stability by Felix: do not process invalid addresses

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@6802 8c9fc860-2736-0410-a75d-ab315db34111
eth.morozova 9 лет назад
Родитель
Сommit
6ae0823104
1 измененных файлов с 9 добавлено и 0 удалено
  1. 9 0
      source/Generic.Reflection.Mod

+ 9 - 0
source/Generic.Reflection.Mod

@@ -437,6 +437,11 @@ CONST
 	PROCEDURE WriteValue*(w: Streams.Writer; refs: Modules.Bytes; VAR offset: LONGINT; adr: ADDRESS; low, high: ADDRESS);
 	PROCEDURE WriteValue*(w: Streams.Writer; refs: Modules.Bytes; VAR offset: LONGINT; adr: ADDRESS; low, high: ADDRESS);
 	VAR type: CHAR; a: ADDRESS; size: SIZE; len: SIZE;
 	VAR type: CHAR; a: ADDRESS; size: SIZE; len: SIZE;
 	BEGIN
 	BEGIN
+		IF ~OnHeapOrStack(adr, low, high) THEN
+			SkipType(refs, offset);
+			w.String("INVALID ADR:"); w.Address(adr);
+			RETURN;
+		END;
 		type := GetChar(refs, offset);
 		type := GetChar(refs, offset);
 		CASE type OF
 		CASE type OF
 			sfTypeNone:
 			sfTypeNone:
@@ -519,6 +524,10 @@ CONST
 		ELSIF c = sfIndirect THEN
 		ELSIF c = sfIndirect THEN
 			adr := base + GetSize(refs, offset);
 			adr := base + GetSize(refs, offset);
 			w.Address(adr); w.String("->"); 
 			w.Address(adr); w.String("->"); 
+			IF ~OnHeapOrStack(adr,low,high) THEN w.String(" (INVALID)"); 
+				SkipType(refs,offset);
+				RETURN;
+			END;
 			SYSTEM.GET(adr, adr);
 			SYSTEM.GET(adr, adr);
 		ELSE (* absolute *)
 		ELSE (* absolute *)
 			adr := GetAddress(refs, offset);
 			adr := GetAddress(refs, offset);