Pārlūkot izejas kodu

Kernel.GetRefVar memory access protection

Alexander Shiryaev 12 gadi atpakaļ
vecāks
revīzija
e021e839b5

BIN
BlackBox/_Linux_/System/Mod/Kernel.odc


+ 59 - 35
BlackBox/_Linux_/System/Mod/Kernel.txt

@@ -3,7 +3,7 @@ MODULE Kernel;
 	(* THIS IS TEXT COPY OF Kernel.odc *)
 	(* DO NOT EDIT *)
 
-	(* A. V. Shiryaev, 2012.09
+	(* A. V. Shiryaev, 2012.11
 		Linux Kernel
 		Based on 1.6-rc6 Windows Kernel
 		+ 20120822 Marc changes
@@ -16,7 +16,6 @@ MODULE Kernel;
 
 		TODO:
 			handle stack overflow exceptions
-			correct cmdLine
 			Quit from TrapHandler
 	*)
 
@@ -278,10 +277,8 @@ MODULE Kernel;
 		currentTryContext: POINTER TO Libc.sigjmp_buf; (* trap return context, if Kernel.Try has been used. *)
 		isReadableContext: Libc.sigjmp_buf; (* for IsReadable *)
 		isReadableCheck: BOOLEAN;
-		
+
 		guiHook: GuiHook;
-		
-		cmdLine-: ARRAY 1024 OF CHAR;
 
 		(* !!! This variable has to be the last variable in the list.  !!! *)
 		bootInfo-: BootInfo;
@@ -496,7 +493,7 @@ MODULE Kernel;
 
 	(* -------------------- system memory management --------------------- *)
 
-	(* A. V. Shiryaev, 2012.09: NOTE: it seems that GC works correctly with positive addesses only *)
+	(* A. V. Shiryaev, 2012.10: NOTE: it seems that GC works correctly with positive addesses only *)
 
 (*
 	PROCEDURE HeapAlloc (adr: INTEGER; size: INTEGER; prot: SET): Libc.PtrVoid;
@@ -1147,18 +1144,64 @@ MODULE Kernel;
 		END
 	END GetRefProc;
 
+	(* A. V. Shiryaev, 2012.11 *)
+	PROCEDURE CheckRefVarReadable (ref: INTEGER): BOOLEAN;
+		VAR ok: BOOLEAN; ch: SHORTCHAR;
+			p: INTEGER; (* address *)
+
+		PROCEDURE Get;
+		BEGIN
+			IF ok THEN
+				IF IsReadable(ref, ref+1) THEN (* S.GET(ref, ch); INC(ref) *) RefCh(ref, ch)
+				ELSE ok := FALSE
+				END
+			END
+		END Get;
+
+		PROCEDURE Num;
+		BEGIN
+			Get; WHILE ok & (ORD(ch) >= 128) DO Get END
+		END Num;
+
+		PROCEDURE Name;
+		BEGIN
+			Get; WHILE ok & (ch # 0X) DO Get END
+		END Name;
+
+	BEGIN
+		ok := TRUE;
+		Get; (* mode *)
+		IF ok & (ch >= 0FDX) THEN
+			Get; (* form *)
+			IF ok & (ch = 10X) THEN
+				IF IsReadable(ref, ref + 4) THEN (* desc *)
+					S.GET(ref, p); INC(ref, 4);
+					ok := IsReadable(p + 2 * 4, p + 3 * 4) (* desc.id *)
+				ELSE ok := FALSE
+				END
+			END;
+			Num; Name
+		END;
+		RETURN ok
+	END CheckRefVarReadable;
+
 	PROCEDURE GetRefVar* (VAR ref: INTEGER; VAR mode, form: SHORTCHAR; VAR desc: Type;
 																VAR adr: INTEGER; VAR name: Name);
 	BEGIN
-		S.GET(ref, mode); desc := NIL;
-		IF mode >= 0FDX THEN
-			mode := SHORT(CHR(ORD(mode) - 0FCH));
-			INC(ref); RefCh(ref, form);
-			IF form = 10X THEN
-				S.GET(ref, desc); INC(ref, 4); form := SHORT(CHR(16 + desc.id MOD 4))
-			END;
-			RefNum(ref, adr); RefName(ref, name)
+		IF CheckRefVarReadable(ref) THEN
+			S.GET(ref, mode); desc := NIL;
+			IF mode >= 0FDX THEN
+				mode := SHORT(CHR(ORD(mode) - 0FCH));
+				INC(ref); RefCh(ref, form);
+				IF form = 10X THEN
+					S.GET(ref, desc); INC(ref, 4); form := SHORT(CHR(16 + desc.id MOD 4))
+				END;
+				RefNum(ref, adr); RefName(ref, name)
+			ELSE
+				mode := 0X; form := 0X; adr := 0
+			END
 		ELSE
+			Msg("Kernel.GetRefVar failed!"); Int(ref);
 			mode := 0X; form := 0X; adr := 0
 		END
 	END GetRefVar;
@@ -2011,32 +2054,13 @@ MODULE Kernel;
 		told := 0; shift := 0
 	END Init;
 
-	PROCEDURE SetCmdLine;
-		VAR i, l: INTEGER;
-	BEGIN
-		l := LEN(cmdLine);
-		cmdLine := bootInfo.argv[0]$;
-		FOR i := 1 TO bootInfo.argc - 1 DO cmdLine := cmdLine + " " + bootInfo.argv[i]END
-	END SetCmdLine;
-	
-	PROCEDURE SetCmdLine2;
-		VAR x: Libc.PtrSTR;
-	BEGIN
-		x := Libc.getenv("CMDLINE");
-		IF x # NIL THEN
-			cmdLine := x$
-		END
-	END SetCmdLine2;
-
 BEGIN
 	IF modList = NIL THEN	(* only once *)
 		S.GETREG(SP, baseStack); (* TODO: Check that this is ok. *)
 		IF bootInfo # NIL THEN
-			modList := bootInfo.modList; (* boot loader initializes the bootInfo struct *)
-			SetCmdLine
+			modList := bootInfo.modList (* boot loader initializes the bootInfo struct *)
 		ELSE
-			S.GETREG(ML, modList);	(* linker loads module list to BX *)
-			SetCmdLine2
+			S.GETREG(ML, modList)	(* linker loads module list to BX *)
 		END;
 		static := init IN modList.opts;
 		inDll := dll IN modList.opts;

BIN
BlackBox/_Linux_/libBB.so


BIN
BlackBox/_Linux_/libBB0.so


BIN
BlackBox/_OpenBSD_/System/Mod/Kernel.odc


+ 55 - 9
BlackBox/_OpenBSD_/System/Mod/Kernel.txt

@@ -3,7 +3,7 @@ MODULE Kernel;
 	(* THIS IS TEXT COPY OF Kernel.odc *)
 	(* DO NOT EDIT *)
 
-	(* A. V. Shiryaev, 2012.10
+	(* A. V. Shiryaev, 2012.11
 		OpenBSD Kernel
 		Based on 1.6-rc6 Windows Kernel
 		+ 20120822 Marc changes
@@ -1139,18 +1139,64 @@ MODULE Kernel;
 		END
 	END GetRefProc;
 
+	(* A. V. Shiryaev, 2012.11 *)
+	PROCEDURE CheckRefVarReadable (ref: INTEGER): BOOLEAN;
+		VAR ok: BOOLEAN; ch: SHORTCHAR;
+			p: INTEGER; (* address *)
+
+		PROCEDURE Get;
+		BEGIN
+			IF ok THEN
+				IF IsReadable(ref, ref+1) THEN (* S.GET(ref, ch); INC(ref) *) RefCh(ref, ch)
+				ELSE ok := FALSE
+				END
+			END
+		END Get;
+
+		PROCEDURE Num;
+		BEGIN
+			Get; WHILE ok & (ORD(ch) >= 128) DO Get END
+		END Num;
+
+		PROCEDURE Name;
+		BEGIN
+			Get; WHILE ok & (ch # 0X) DO Get END
+		END Name;
+
+	BEGIN
+		ok := TRUE;
+		Get; (* mode *)
+		IF ok & (ch >= 0FDX) THEN
+			Get; (* form *)
+			IF ok & (ch = 10X) THEN
+				IF IsReadable(ref, ref + 4) THEN (* desc *)
+					S.GET(ref, p); INC(ref, 4);
+					ok := IsReadable(p + 2 * 4, p + 3 * 4) (* desc.id *)
+				ELSE ok := FALSE
+				END
+			END;
+			Num; Name
+		END;
+		RETURN ok
+	END CheckRefVarReadable;
+
 	PROCEDURE GetRefVar* (VAR ref: INTEGER; VAR mode, form: SHORTCHAR; VAR desc: Type;
 																VAR adr: INTEGER; VAR name: Name);
 	BEGIN
-		S.GET(ref, mode); desc := NIL;
-		IF mode >= 0FDX THEN
-			mode := SHORT(CHR(ORD(mode) - 0FCH));
-			INC(ref); RefCh(ref, form);
-			IF form = 10X THEN
-				S.GET(ref, desc); INC(ref, 4); form := SHORT(CHR(16 + desc.id MOD 4))
-			END;
-			RefNum(ref, adr); RefName(ref, name)
+		IF CheckRefVarReadable(ref) THEN
+			S.GET(ref, mode); desc := NIL;
+			IF mode >= 0FDX THEN
+				mode := SHORT(CHR(ORD(mode) - 0FCH));
+				INC(ref); RefCh(ref, form);
+				IF form = 10X THEN
+					S.GET(ref, desc); INC(ref, 4); form := SHORT(CHR(16 + desc.id MOD 4))
+				END;
+				RefNum(ref, adr); RefName(ref, name)
+			ELSE
+				mode := 0X; form := 0X; adr := 0
+			END
 		ELSE
+			Msg("Kernel.GetRefVar failed!"); Int(ref);
 			mode := 0X; form := 0X; adr := 0
 		END
 	END GetRefVar;

BIN
BlackBox/_OpenBSD_/libBB.so


BIN
BlackBox/_OpenBSD_/libBB0.so


+ 1 - 0
README

@@ -63,6 +63,7 @@ Files:
 					Kernel.InstallSignals:
 						do not install signal handler for SIGTHR (when executable linked with -pthread)
 					IsReadable
+				GetRefVar memory access protection
 		_Linux_/System/Mod/Kernel.odc:
 			_OpenBSD_/System/Mod/Kernel.odc modified for Linux:
 				Time*