× The internal search function is temporarily non-functional. The current search engine is no longer viable and we are researching alternatives.
As a stop gap measure, we are using Google's custom search engine service.
If you know of an easy to use, open source, search engine ... please contact support@midrange.com.


  • Subject: RE: MATCTX (was Detecting changing objects...)
  • From: Leif Svalgaard <l.svalgaard@xxxxxxxxxxxxx>
  • Date: Tue, 23 Nov 1999 17:39:19 -0600




        [Leif Svalgaard]  Bruce, I've left the entire thread in this posting
to have
        the complete context. 
        Here is first the C-program MATCTX:

        #include <qusmiapi.h>

        void main(int argc, char *argv[]) {
        typedef struct {
          _SYSPTR SystemPtr;
        } s; s* SysPtr;
        SysPtr = (s*) argv[2];
        QusMaterializeContext((_SPCPTR) argv[1],
                                SysPtr->SystemPtr,
                              ( void *) argv[3]);
        }

        [Leif Svalgaard]  this is compiled etc into the *PGM MATCTX which
        I will call later on.

        Here is then the MI-program that calls it (and also tries to execute
        the MI-instruction MATCTX directly). If the program is called with
the
        parameter C it calls the C-program, if called with any other
parameter
        (e.g. M) it executes MATCTX as an MI-instruction.

        DCL SPCPTR .LIB-OPTIONS INIT(LIB-OPTIONS);
        DCL DD      LIB-OPTIONS CHAR(44) BDRY(16);
            DCL DD LIB-INFO-REQD CHAR(1)  DEF(LIB-OPTIONS) POS( 1)
INIT(X'0F');
            DCL DD LIB-SELECTION CHAR(1)  DEF(LIB-OPTIONS) POS( 2)
INIT(X'10');
            DCL DD LIB-NAME-SIZE  BIN(2)  DEF(LIB-OPTIONS) POS( 3) INIT(30);
            DCL DD LIB-SEL-TYPE  CHAR(1)  DEF(LIB-OPTIONS) POS( 5);
            DCL DD LIB-SEL-STYPE CHAR(1)  DEF(LIB-OPTIONS) POS( 6);
            DCL DD LIB-SEL-NAME  CHAR(30) DEF(LIB-OPTIONS) POS( 7);
            DCL DD LIB-SEL-TSTMP CHAR(8)  DEF(LIB-OPTIONS) POS(37);
                DCL DD * CHAR(4) DEF(LIB-SEL-TSTMP) POS(1)
INIT(X'00000000');
                DCL DD * CHAR(4) DEF(LIB-SEL-TSTMP) POS(5)
INIT(X'00000000');

        DCL SPCPTR .LIB-SPACE;
        DCL DD      LIB-SPACE (10000)CHAR(48) BDRY(16) AUTO;
            DCL DD LIB-BYTES-PRV    BIN(4)  DEF(LIB-SPACE) POS(  1);
            DCL DD LIB-BYTES-AVL    BIN(4)  DEF(LIB-SPACE) POS(  5);
            DCL DD LIB-OBJ-TYPE    CHAR(1)  DEF(LIB-SPACE) POS(  9);
            DCL DD LIB-OBJ-STYPE   CHAR(1)  DEF(LIB-SPACE) POS( 10);
            DCL DD LIB-OBJ-NAME    CHAR(30) DEF(LIB-SPACE) POS( 11);
            DCL DD LIB-OBJ-OPTIONS CHAR(4)  DEF(LIB-SPACE) POS( 41);
            DCL DD LIB-RCV-OPTIONS CHAR(4)  DEF(LIB-SPACE) POS( 45);
            DCL DD LIB-SPC-SIZE     BIN(4)  DEF(LIB-SPACE) POS( 49);
            DCL DD LIB-SPC-INIT    CHAR(1)  DEF(LIB-SPACE) POS( 53);
            DCL DD LIB-PRFM-CLASS  CHAR(4)  DEF(LIB-SPACE) POS( 54);
            DCL DD *               CHAR(7)  DEF(LIB-SPACE) POS( 58);
            DCL SYSPTR *                    DEF(LIB-SPACE) POS( 65);
            DCL SYSPTR LIB-ACS-GRP          DEF(LIB-SPACE) POS( 81);
            DCL DD LIB-EXTND-ATTR  CHAR(1)  DEF(LIB-SPACE) POS( 97);
            DCL DD *               CHAR(7)  DEF(LIB-SPACE) POS( 98);
            DCL DD LIB-OBJ-TSTAMP  CHAR(8)  DEF(LIB-SPACE) POS(105);

        DCL DD LIB-HDR-SIZE       BIN(4) INIT(112);
        DCL DD LIB-ENTRY-SIZE     BIN(4) INIT(48);
        DCL DD LIB-NBR-OF-ENTRIES BIN(4);
        DCL SPCPTR .LIB-ENTRY;
        DCL DD      LIB-ENTRY CHAR(48) BAS(.LIB-ENTRY);
            DCL DD  LIB-ENTRY-TYPE  CHAR(2)  DEF(LIB-ENTRY) POS( 1);
            DCL DD  LIB-ENTRY-NAME  CHAR(30) DEF(LIB-ENTRY) POS( 3);
            DCL SYSPTR .LIB-OBJ-PTR          DEF(LIB-ENTRY) POS(33);
            DCL DD      LIB-OBJ-PTR CHAR(8)  DEF(LIB-ENTRY) POS(41);

        DCL SPCPTR .OBJ-OPTIONS INIT(OBJ-OPTIONS);
        DCL DD      OBJ-OPTIONS CHAR(44) BDRY(16);
            DCL DD OBJ-INFO-REQD CHAR(1)  DEF(OBJ-OPTIONS) POS( 1)
INIT(X'0F');
            DCL DD OBJ-SELECTION CHAR(1)  DEF(OBJ-OPTIONS) POS( 2)
INIT(X'10');
            DCL DD OBJ-NAME-SIZE  BIN(2)  DEF(OBJ-OPTIONS) POS( 3) INIT(30);
            DCL DD OBJ-SEL-TYPE  CHAR(1)  DEF(OBJ-OPTIONS) POS( 5);
            DCL DD OBJ-SEL-STYPE CHAR(1)  DEF(OBJ-OPTIONS) POS( 6);
            DCL DD OBJ-SEL-NAME  CHAR(30) DEF(OBJ-OPTIONS) POS( 7);
            DCL DD OBJ-SEL-TSTMP CHAR(8)  DEF(OBJ-OPTIONS) POS(37);

        DCL SPCPTR .OBJ-SPACE;
        DCL DD      OBJ-SPACE (100000)CHAR(48) BDRY(16) AUTO;
            DCL DD OBJ-BYTES-PRV    BIN(4)  DEF(OBJ-SPACE) POS(  1);
            DCL DD OBJ-BYTES-AVL    BIN(4)  DEF(OBJ-SPACE) POS(  5);
            DCL DD OBJ-OBJ-TYPE    CHAR(1)  DEF(OBJ-SPACE) POS(  9);
            DCL DD OBJ-OBJ-STYPE   CHAR(1)  DEF(OBJ-SPACE) POS( 10);
            DCL DD OBJ-OBJ-NAME    CHAR(30) DEF(OBJ-SPACE) POS( 11);
            DCL DD OBJ-OBJ-OPTIONS CHAR(4)  DEF(OBJ-SPACE) POS( 41);
            DCL DD OBJ-RCV-OPTIONS CHAR(4)  DEF(OBJ-SPACE) POS( 45);
            DCL DD OBJ-SPC-SIZE     BIN(4)  DEF(OBJ-SPACE) POS( 49);
            DCL DD OBJ-SPC-INIT    CHAR(1)  DEF(OBJ-SPACE) POS( 53);
            DCL DD OBJ-PRFM-CLASS  CHAR(4)  DEF(OBJ-SPACE) POS( 54);
            DCL DD *               CHAR(7)  DEF(OBJ-SPACE) POS( 58);
            DCL SYSPTR *                    DEF(OBJ-SPACE) POS( 65);
            DCL SYSPTR OBJ-ACS-GRP          DEF(OBJ-SPACE) POS( 81);
            DCL DD OBJ-EXTND-ATTR  CHAR(1)  DEF(OBJ-SPACE) POS( 97);
            DCL DD *               CHAR(7)  DEF(OBJ-SPACE) POS( 98);
            DCL DD OBJ-OBJ-TSTAMP  CHAR(8)  DEF(OBJ-SPACE) POS(105);

        DCL DD OBJ-HDR-SIZE       BIN(4) INIT(112);
        DCL DD OBJ-ENTRY-SIZE     BIN(4) INIT(48);
        DCL DD OBJ-NBR-OF-ENTRIES BIN(4);
        DCL SPCPTR .OBJ-ENTRY;
        DCL DD      OBJ-ENTRY CHAR(48) BAS(.OBJ-ENTRY);
            DCL DD  OBJ-ENTRY-TYPE  CHAR(2)  DEF(OBJ-ENTRY) POS( 1);
            DCL DD  OBJ-ENTRY-NAME  CHAR(30) DEF(OBJ-ENTRY) POS( 3);
            DCL SYSPTR .OBJ-OBJ-PTR          DEF(OBJ-ENTRY) POS(33);
            DCL DD      OBJ-OBJ-PTR CHAR(8)  DEF(OBJ-ENTRY) POS(41);

        DCL DD CUR-OFFSET BIN(4);

        DCL SPCPTR .PARM1 PARM;
        DCL DD CHOICE CHAR(1) BAS(.PARM1);
        DCL OL *ENTRY(.PARM1) PARM EXT MIN(1);

        DCL DD RESOLVE CHAR(34) AUTO;
            DCL DD RESOLVE-TYPE CHAR( 2) DEF(RESOLVE) POS( 1);
            DCL DD RESOLVE-NAME CHAR(30) DEF(RESOLVE) POS( 3);
            DCL DD RESOLVE-AUTH CHAR( 2) DEF(RESOLVE) POS(33) INIT(X'0000');

        DCL SYSPTR .MATCTX;

        
/*******************************************************************/

        ENTRY * (*ENTRY) EXT;
            CPYBLA     RESOLVE-TYPE, X'0201';
            CPYBLAP    RESOLVE-NAME, "MATCTX", " ";
            RSLVSP    .MATCTX, RESOLVE, *, *;

            SETSPP    .LIB-SPACE, LIB-SPACE;
            SETSPP    .OBJ-SPACE, OBJ-SPACE;

            CPYBLA     YYYYMMDDHHMMSS, "19991123120000";
            CALLI      CONVERT-TO-TIMESTAMP, *, .DATE-TIME;
            CPYBLA     OBJ-SEL-TSTMP, TIMESTAMP;

            CPYNV      LIB-BYTES-PRV, LIB-ENTRY-SIZE;
            MULT(S)    LIB-BYTES-PRV,  10000;

            CPYNV      OBJ-BYTES-PRV, OBJ-ENTRY-SIZE;
            MULT(S)    OBJ-BYTES-PRV, 100000;

        MATERIALIZE-LIBRARIES:
            CALLI      GET-LIBS, *, .GET-LIBS;
            ADDSPP    .LIB-ENTRY, .LIB-SPACE, LIB-HDR-SIZE;
            SUBN       LIB-NBR-OF-ENTRIES, LIB-BYTES-AVL, LIB-HDR-SIZE;
            DIV(SB)    LIB-NBR-OF-ENTRIES, LIB-ENTRY-SIZE/ZER(DONE-LIBS);
        HAVE-LIBRARY:
            CMPBLA(B)  LIB-ENTRY-TYPE, X'0401'/NEQ(DONE-OBJS);

        MATERIALIZE-OBJECTS:
            CALLI      GET-OBJS, *, .GET-OBJS;
            ADDSPP    .OBJ-ENTRY, .OBJ-SPACE, OBJ-HDR-SIZE;
            SUBN(B)    OBJ-NBR-OF-ENTRIES, OBJ-BYTES-AVL, OBJ-HDR-SIZE
                                                         /NEG(DONE-OBJS);
            DIV(SB)    OBJ-NBR-OF-ENTRIES, OBJ-ENTRY-SIZE/ZER(DONE-OBJS);
        HAVE-OBJECT:
            BRK "OBJ";

        DONE-DESCR:
            ADDSPP    .OBJ-ENTRY, .OBJ-ENTRY, OBJ-ENTRY-SIZE;
            SUBN(SB)   OBJ-NBR-OF-ENTRIES, 1/NZER(HAVE-OBJECT);

        DONE-OBJS:
            ADDSPP    .LIB-ENTRY, .LIB-ENTRY, LIB-ENTRY-SIZE;
            SUBN(SB)   LIB-NBR-OF-ENTRIES, 1/NZER(HAVE-LIBRARY);

        DONE-LIBS:
            RTX        *;

        DCL INSPTR .GET-LIBS;
        ENTRY       GET-LIBS INT;
            MATCTX    .LIB-SPACE, *, LIB-OPTIONS;
            B         .GET-LIBS;

        DCL INSPTR .GET-OBJS;
        ENTRY       GET-OBJS INT;
            CMPBLA(B)  CHOICE, "C"/EQ(CALL-C-PGM);
            MATCTX    .OBJ-SPACE, .LIB-OBJ-PTR, OBJ-OPTIONS;
            B         .GET-OBJS;

        DCL SPCPTR .MAT-API INIT(MAT-API);
        DCL DD      MAT-API CHAR(16)  BDRY(16);
            DCL SYSPTR .MAT-OBJ DEF(MAT-API) POS(1);

        DCL OL MATCTX-OBJ (.OBJ-SPACE, .MAT-API, .OBJ-OPTIONS);

        CALL-C-PGM:
            CPYBWP    .MAT-OBJ, .LIB-OBJ-PTR;
            CALLX     .MATCTX,   MATCTX-OBJ, *;
            B         .GET-OBJS;

        
/*******************************************************************/
        /* TIMESTAMP AND DATE CONVERSIONS */
        DCL DD TIMESTAMP CHAR(8);
            DCL DD TIMESTAMP-HI-BITS BIN(4) UNSGND DEF(TIMESTAMP) POS(1);
            DCL DD TIMESTAMP-LO-BITS BIN(4) UNSGND DEF(TIMESTAMP) POS(5);

        DCL DD TIMESTAMP-64  PKD(21,0); /* CAN HOLD 64-BIT UNSIGNED */
        DCL DD TIMESTAMP-HI  PKD(11,0);
        DCL DD TIMESTAMP-LO  PKD(11,0);
        DCL DD TWO**32       PKD(11,0) INIT(P'4294967296');
        DCL DD NBR-SECONDS   PKD(15,0);
        DCL DD NBR-DAYS      BIN(4);
        DCL DD NBR-YEARS     BIN(4);
        DCL DD ADD-YEARS     BIN(4);
        DCL DD NBR-PERIODS   BIN(4);
        DCL DD DAY-MONTH     BIN(4);
        DCL DD S             BIN(4);
        DCL DD D             BIN(4);
        DCL DD M             BIN(4);
                  /* DAY BASE FOR: JanFebMarAprMayJunJulAugSepOctNovDec*/
        DCL DD DAYS CHAR(36) INIT("000031059090120151181212243273304334");
        DCL DD DAYS-ACCUM (12)ZND(3,0) DEF(DAYS) POS(1);

        DCL DD YYYYMMDDHHMMSS CHAR(14);
            DCL DD YEAR  ZND(4,0) DEF(YYYYMMDDHHMMSS) POS( 1);
            DCL DD MONTH ZND(2,0) DEF(YYYYMMDDHHMMSS) POS( 5);
            DCL DD DAY   ZND(2,0) DEF(YYYYMMDDHHMMSS) POS( 7);
            DCL DD HOUR  ZND(2,0) DEF(YYYYMMDDHHMMSS) POS( 9);
            DCL DD MIN   ZND(2,0) DEF(YYYYMMDDHHMMSS) POS(11);
            DCL DD SEC   ZND(2,0) DEF(YYYYMMDDHHMMSS) POS(13);

        DCL INSPTR .DATE-TIME;
        ENTRY CONVERT-TO-TIMESTAMP INT;
            SUBN       NBR-YEARS, YEAR, 1925;
            DIVREM     NBR-PERIODS, NBR-YEARS, 4, ADD-YEARS;
            MULT       NBR-DAYS, NBR-PERIODS, 1461;
            MULT       D, ADD-YEARS, 365;
            ADDN(S)    NBR-DAYS, D;         /* ONE TOO LARGE */
            CPYNV      M, MONTH;
            ADDN(S)    NBR-DAYS, DAYS-ACCUM(M);
            ADDN(S)    NBR-DAYS, DAY;
            CMPNV(B)   ADD-YEARS, 3/NEQ(A); /* LEAP YEAR ADJUST: */
            CMPNV(B)   MONTH,     2/HI (C); /* IF LATER THAN FEB */
        A:  SUBN(S)    NBR-DAYS, 1;
        C:  MULT       NBR-SECONDS, NBR-DAYS, 86400;
            MULT       S, HOUR, 60;
            ADDN(S)    S, MIN;
            MULT(S)    S, 60;
            ADDN(S)    S, SEC;
            ADDN(S)    NBR-SECONDS, S;
            SUBN(S)    NBR-SECONDS, 114955386; /* AUG 23, 1928, 12:03:06 */
            MULT       TIMESTAMP-64, NBR-SECONDS, 4096000000;
            DIVREM     TIMESTAMP-HI-BITS, TIMESTAMP-64, TWO**32,
                       TIMESTAMP-LO-BITS;
            B         .DATE-TIME;

        PEND;

        call rtvobjs c       works
        call rtvobjs m      bombs with 'hardware protection violation'

        When the c-version is running the call stack obviously bottoms
        out with QusMaterializeContext. Since this program is a system
        state program we have no problem.

        V4R2 SL40: MI-program OK,  C-progam OK
        V4R3 SL40: MI-program NFG, C-program OK
        V4R3 SL50: MI-program NFG, C-program OK

        If I use SST to change the MI-program to system state 
        everything works, of course. 

> I am unable to recreate this exposure (on V4R4 at 50 anyway), and am not
> sure I understand your exact environment.  The two builtins I looked
> at (_MATCTX1 and _MATCTX2) are system builtins that map directly to
> the MI instruction so I'm not clear on what system state program you
> are seeing on the stack.
> 
> I can also think of scenarios where C runtime is simply doing the same
> checking (if not actually using) as the QusMaterializeContext API and
> so no breach necessarily exists (though in my test environment I got
> MCH6801 with the C builtin _MATCTX2 which suggests the runtime isn't
> using the API so one scenario may be scratched...).
> 
> Could you send me a quick test case and what release/security level you
> are seeing the successful run on?
> 
> Thanks,
> Bruce
> 
> >
> >The V4R2 functional reference manual does not mention any
> >restrictions. Anyway, I still don't have a *rationale* for why
> >an obvious security breach is allowed in C and not in MI.
> >
> >As I mentioned in my post it is*obvious* that it would work
> >with the C-program because at the bottom of the API it
> >is a system state program that executes the MATCTX.
> >What is not obvious is why *this* breach is allowed.
> >So my question still stands. It is not about "how",
> >but about "why"?
> >
> >> -----Original Message-----
> >> From: bvining@VNET.IBM.COM [SMTP:bvining@VNET.IBM.COM]
> >> Sent: Friday, November 19, 1999 10:21 AM
> >> To:   MI400@midrange.com
> >> Subject:        MATCTX (was Detecting changing objects...)
> >>
> >> If MATCTX was working prior to V4R3 for explicit libraries then the
> >> bug is in the previous releases and not V4R3.  For many releases
> >> there has been a restriction concerning passing system pointers to
> >> system domain objects from user state programs (at higher security
> >> levels); I suspect it is this restriction (the explict system pointer
> >> to the context/library) that is causing the failure.
> >>
> >> Because of this IBM provided the API QusMaterializeContext (you can
> >> probably guess what it does based on the name) back in one of the V3
> >> releases (it's in the V3R7 manual anyway).  This API is documented in
> >> the Object APIs chapter of the System API Reference (though it
> basically
> >> points you to the MI Functional Reference as the API is just a front
> end
> >> to MATCTX that puts you into the proper state).  Other front ends of
> >> this type exist, such as QusMaterializeJournalPortAttr in the Journal
> >> and Commit APIs chapter).
> >>
> >> Bruce
> >>
> >> >
> >> >A problem with MATCTX is that from V4R3M0 it seems to be
> >> >a restricted operation (except when materializing the machine
> >> >context - * ) and gives you a protection violation at security
> >> >level 40 and above if your program is a user state program.
> >> >Interestingly enough, the C function matctx does not have
> >> >that problem. (I can hear the C-bigots snicker already).
> >> >This is because the C interface goes through a service
> >> >program that is not a user state program. As far as I am
> >> >concerned thus is a bug. It does not make sense to
> >> >have a restriction that is that easily circumvented. Maybe
> >> >the bug has already been fixed in V4R4M0. If not, it
> >> >either should be fixed or it should not be a restricted
> >> >operation.
> >> >
> >>
> 
+---
| This is the MI Programmers Mailing List!
| To submit a new message, send your mail to MI400@midrange.com.
| To subscribe to this list send email to MI400-SUB@midrange.com.
| To unsubscribe from this list send email to MI400-UNSUB@midrange.com.
| Questions should be directed to the list owner/operator: dr2@cssas400.com
+---


As an Amazon Associate we earn from qualifying purchases.

This thread ...


Follow On AppleNews
Return to Archive home page | Return to MIDRANGE.COM home page

This mailing list archive is Copyright 1997-2024 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].

Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.