[Oberon] Serious type loophole in type case statements and a possible fix

Michael Schierl schierlm at gmx.de
Fri Oct 30 23:05:16 CET 2020


Hello Andreas,


Am 30.10.2020 um 14:05 schrieb Andreas Pirklbauer:
> The official Oberon-07 compiler, as published at www.projectoberon.com,
> contains a serious type loophole in type case statements
>

[...]


> but continues to ALLOW…
>
>     1. Local variables or parameters (value or VAR) parameters as case variables

I think this can be exploited:

MODULE TestB;
   IMPORT Texts, Oberon;

   TYPE R0 = RECORD END;
     R1 = RECORD (R0) fld1: SET END;
     R2 = RECORD (R0) fld2: INTEGER END;
     P0 = POINTER TO R0;
     P1 = POINTER TO R1;
     P2 = POINTER TO R2;

   VAR p0: P0; p1: P1; p2: P2; W: Texts.Writer;

   PROCEDURE checkA(VAR p: P0);
   BEGIN
     CASE p OF P1:
         p0 := p2;
         p.fld1 := {4,1}
     END;
     Texts.WriteInt(W, p2.fld2, 4);     (*18*)
     Texts.Append(Oberon.Log, W.buf)
   END checkA;

   PROCEDURE Go*;
   BEGIN p0 := p1; checkA(p0)
   END Go;

BEGIN NEW(p1); NEW(p2); Texts.OpenWriter(W)
END TestB.


Using a real (but harmless) type confusion from SET to INTEGER to prove
the point better :-)

This can obviously can be more convoluted/sophisticated, and I can't
think of an easy way to fix it without disallowing POINTER VAR
parameters altogether.


Regards,


Michael


More information about the Oberon mailing list