Article 1409 of vmsnet.sources:
Path: nntpd.lkg.dec.com!sousa.amt.tay1.dec.com!pa.dec.com!decwrl!infopiz!news1.best.com!sgigate.sgi.com!swrinde!gatech!news.mathworks.com!mvb.saic.com!vmsnet-sources
Newsgroups: vmsnet.sources
Subject: JUMP, part 05/05
Message-ID: <64791162@MVB.SAIC.COM>
From: jonathan@hermes.ucs.unimelb.EDU.AU (Jonathan Ridler)
Date: Fri, 10 Nov 1995 03:26:54 GMT
Followup-To: vmsnet.sources.d
Organization: The University of Melbourne
Approved: Mark.Berryman@Mvb.Saic.Com
Lines: 289

Submitted-by: jonathan@hermes.ucs.unimelb.EDU.AU (Jonathan Ridler)
Posting-number: Volume 7, Issue 68
Archive-name: jump/part05

-+-+-+-+-+-+-+-+ START OF PART 5 -+-+-+-+-+-+-+-+
X`5BASYNCHRONOUS`5D`20PROCEDURE`20Getuic`20;
X
X`7B`20In`20EXEC`20MODE,`20peek`20at`20the`20UIC`20in`20the`20PCB.`20`7D
X
X`20`20BEGIN
X`20`20Sanity_Uic.UIC$L_UIC`20:=`20Uic_Ptr`5E`20;
X`20`20END`20;
X
X
X`5BASYNCHRONOUS`5D`20PROCEDURE`20Setuic`20;
X
X`7B`20In`20KERNEL`20MODE,`20poke`20a`20new`20UIC`20into`20the`20PCB.`20`7D
X
X`20`20BEGIN
X`20`20Uic_Ptr`5E`20:=`20New_Uic.UIC$L_UIC`20;
X`20`20END`20;
X
X
X`5BASYNCHRONOUS`5D`20PROCEDURE`20Get_Jib_User_Ptr`20;
X
X`7B`20In`20EXEC`20MODE,`20peek`20at`20the`20JIB`20in`20the`20PCB.`20`7D
X
X`20`20BEGIN
X`20`20Jib_User_Ptr::UNSIGNED`20:=`20Jib_Ptr`5E`20;
X`20`20END`20;
X
X
X`5BASYNCHRONOUS`5D`20PROCEDURE`20Getuser`20;
X
X`7B`20In`20EXEC`20MODE,`20peek`20at`20the`20Username`20in`20the`20Control`20Re
Vgion`20and`20in`20the`20PCB.`20`7D
X
X`20`20BEGIN
X`20`20Sanity_Ctl_User`20:=`20CTL$T_USERNAME`20;
X`20`20Sanity_Jib_User`20:=`20Jib_User_Ptr`5E`20;
X`20`20END`20;
X
X
X`5BASYNCHRONOUS`5D`20PROCEDURE`20Setuser`20;
X
X`7B`20In`20KERNEL`20MODE,`20poke`20a`20new`20Username`20into`20the`20Control
V`20Region`20and`20into`20the`20PCB.`7D
X
X`20`20BEGIN
X`20`20CTL$T_USERNAME`20:=`20New_User.BODY`20;
X`20`20Jib_User_Ptr`5E`20`20:=`20New_User.BODY`20;
X`20`20END`20;
X
X
XPROCEDURE`20Wallaby`20;
X
X`7B`20Change`20the`20username.`20`7D
X
X`20`20BEGIN`20`09`7B`20Wallaby`20`7D
X
X`20`20`7B`20Check`20that`20the`20username`20as`20returned`20by`20GETJPI`20and
V`20as`20peeked`20at`20in`20EXEC`20MODE
X`20`20`20`20agree`20--`20do`20this`20as`20a`20sanity`20check.`20`7D
X
X`20`20Jib_Ptr::UNSIGNED`20:=`20CTL$GL_PCB`20+`20IADDRESS`20(PCB$L_JIB)`20;
X`20`20$CMEXEC`20(Get_Jib_User_Ptr,%IMMED`200)`20;
X
X`20`20Jib_User_Ptr::UNSIGNED`20:=`20Jib_User_Ptr::UNSIGNED`20+`20IADDRESS`20(J
VIB$T_USERNAME)`20;
X`20`20$CMEXEC`20(Getuser,%IMMED`200)`20;
X
X`20`20IF`20(Sanity_Ctl_User`20<>`20User.BODY)`20`20OR
X`20`20`20`20`20(Sanity_Jib_User`20<>`20User.BODY)`20`20THEN
X`20`20`20`20`20BEGIN
X`20`20`20`20`20WRITELN`20('%JUMP-F-INSANEUSER,`20Sanity`20Check`20FAILED`20for
V`20Username!')`20;
X`20`20`20`20`20WRITELN`20('%JUMP-F-USERVALUES,`20GetJPI`20=`20',User,'`20Contr
Vol`20=`20',
X`09`20`20`20`20`20`20Sanity_Ctl_User,'`20JIB`20=`20',Sanity_Jib_User)`20;
X`20`20`20`20`20$EXIT`20(SS$_ABORT)`20;
X`20`20`20`20`20END
X`20`20`20ELSE
X`20`20`20`20`20$CMKRNL`20(Setuser,%IMMED`200)`20;
X`20`20END`20;`20`09`7B`20of`20Wallaby`20`7D
X
X
XPROCEDURE`20Kangaroo`20;
X
X`7B`20Do`20all`20that`20is`20required`20to`20"jump"`20to`20the`20new`20user,
V`20or`20to`20return`20to`20the
X`20`20original`20user.`20`7D
X
X`20`20VAR`09Rst`20,`20Attributes`20:`20UNSIGNED`20:=`200`20;
X`09Aclstr`20:`20VARYING`20`5B64`5D`20OF`20CHAR`20:=`20''`20;
X`09Aclent`20:`20PACKED`20ARRAY`20`5B1..32`5D`20OF`20CHAR`20:=`20''`20;
X`09Grptbl`20:`20PACKED`20ARRAY`20`5B1..16`5D`20OF`20CHAR`20:=`20''`20;
X`09Item_List`20:`20Item_List_Template`20(3)`20:=`20ZERO`20;
X
X`20`20BEGIN`20`09`7B`20Kangaroo`20`7D
X
X`20`20`7B`20Check`20that`20the`20UIC`20as`20returned`20by`20GETJPI`20and`20as
V`20peeked`20at`20in`20EXEC`20MODE
X`20`20`20`20agree`20--`20do`20this`20as`20a`20sanity`20check.`20`7D
X
X`20`20Uic_Ptr::UNSIGNED`20:=`20CTL$GL_PCB`20+`20IADDRESS`20(PCB$L_UIC)`20;
X`20`20$CMEXEC`20(Getuic,%IMMED`200)`20;
X
X`20`20IF`20Sanity_Uic.UIC$L_UIC`20<>`20Uic.UIC$L_UIC`20`20THEN
X`20`20`20`20`20BEGIN
X`20`20`20`20`20WRITELN`20('%JUMP-F-INSANEUIC,`20Sanity`20Check`20FAILED`20for
V`20UIC!')`20;
X`20`20`20`20`20WRITELN`20('%JUMP-F-UICVALUES,`20GetUAI`20=',HEX`20(Uic.UIC$L_U
VIC),'`20Kernel`20=',
X`09`20`20`20`20`20`20HEX`20(Sanity_Uic.UIC$L_UIC))`20;
X`20`20`20`20`20$EXIT`20(SS$_ABORT)`20;
X`20`20`20`20`20END
X`20`20`20ELSE
X`20`20`20`20`20BEGIN
X`20`20`20`20`20$CMKRNL`20(Setuic,%IMMED`200)`20;`09`7B`20Change`20UIC`20to`20b
Ve`20target`20UIC.`20`7D
X
X`20`20`20`20`20`7B`20Set`20new`20default`20directory.`20`7D
X
X`20`20`20`20`20Rst`20:=`20SYS$SETDDIR`20(SUBSTR`20(Def_Dir.BODY,1,Def_Dir.LENG
VTH))`20;
X`20`20`20`20`20IF`20NOT`20ODD`20(Rst)`20`20THEN
X`09LIB$SIGNAL`20(Rst)`20;
X
X`20`20`20`20`20`7B`20Set`20new`20default`20disk.`20`7D
X
X`20`20`20`20`20Item_List`5B1`5D.Buffer_Length`20:=`20Def_Dev.LENGTH`20;
X`20`20`20`20`20Item_List`5B1`5D.Item_Code`09:=`20LNM$_STRING`20;
X`20`20`20`20`20Item_List`5B1`5D.Buffer_Addr`09:=`20IADDRESS`20(Def_Dev.BODY)
V`20;
X`20`20`20`20`20Item_List`5B1`5D.Return_Addr`09:=`200`20;
X
X`20`20`20`20`20Item_List`5B2`5D.Terminator`09:=`200`20;
X
X`20`20`20`20`20Rst`20:=`20$CRELNM`20(Tabnam`20:=`20%STDESCR`20'LNM$PROCESS',
X`09`09`20`20`20`20`20Lognam`20:=`20%STDESCR`20'SYS$DISK',
X`09`09`20`20`20`20`20Acmode`20:=`20PSL$C_SUPER,
X`09`09`20`20`20`20`20Itmlst`20:=`20Item_List)`20;
X`20`20`20`20`20IF`20NOT`20ODD`20(Rst)`20`20THEN
X`09LIB$SIGNAL`20(Rst)`20;
X
X`20`20`20`20`20`7B`20Point`20LNM$GROUP`20logical`20to`20group`20table`20for`20
Vnew`20UIC.`20`7D
X
X`20`20`20`20`20Attributes`20:=`20LNM$M_TERMINAL`20;
X`20`20`20`20`20Grptbl`20:=`20'LNM$GROUP_'`20+`20OCT`20(New_Uic.UIC$V_GROUP,6,6
V)`20;
X
X`20`20`20`20`20Item_List`5B1`5D.Buffer_Length`20:=`204`20;
X`20`20`20`20`20Item_List`5B1`5D.Item_Code`09:=`20LNM$_ATTRIBUTES`20;
X`20`20`20`20`20Item_List`5B1`5D.Buffer_Addr`09:=`20IADDRESS`20(Attributes)`20;
V
X`20`20`20`20`20Item_List`5B1`5D.Return_Addr`09:=`200`20;
X
X`20`20`20`20`20Item_List`5B2`5D.Buffer_Length`20:=`20SIZE`20(Grptbl)`20;
X`20`20`20`20`20Item_List`5B2`5D.Item_Code`09:=`20LNM$_STRING`20;
X`20`20`20`20`20Item_List`5B2`5D.Buffer_Addr`09:=`20IADDRESS`20(Grptbl)`20;
X`20`20`20`20`20Item_List`5B2`5D.Return_Addr`09:=`200`20;
X
X`20`20`20`20`20Item_List`5B3`5D.Terminator`09:=`200`20;
X
X`20`20`20`20`20Rst`20:=`20$CRELNM`20(Tabnam`20:=`20%STDESCR`20'LNM$PROCESS_DIR
VECTORY',
X`09`09`20`20`20`20`20Lognam`20:=`20%STDESCR`20'LNM$GROUP',
X`09`09`20`20`20`20`20Acmode`20:=`20PSL$C_KERNEL,
X`09`09`20`20`20`20`20Itmlst`20:=`20Item_List)`20;
X`20`20`20`20`20IF`20NOT`20ODD`20(Rst)`20`20THEN
X`09LIB$SIGNAL`20(Rst)`20;
X
X`20`20`20`20`20`7B`20If`20going`20to`20a`20different`20UIC,`20allow`20the`20cu
Vrrent`20LNM$JOB`20logical`20name`20table
X`20`20`20`20`20`20`20to`20be`20accessed`20by`20the`20new`20UIC.`20`20If`20retu
Vrning`20to`20original`20user,`20remove`20the
X`20`20`20`20`20`20`20ACL`20access`20previously`20applied.`20`7D
X
X`20`20`20`20`20Item_List`5B2`5D.Terminator`20:=`200`20;
X
X`20`20`20`20`20IF`20New_User`20=`20User`20`20THEN`09`09`7B`20Return`20to`20ori
Vginal`20user.`20`7D
X`09BEGIN
X`09Item_List`5B1`5D.Buffer_Length`20:=`200`20;
X`09Item_List`5B1`5D.Item_Code`09`20`20`20:=`20ACL$C_DELETEACL`20;
X`09Item_List`5B1`5D.Buffer_Addr`20`20`20:=`200`20;
X`09Item_List`5B1`5D.Return_Addr`20`20`20:=`200`20;
X`09END
X`20`20`20`20`20`20ELSE
X`09BEGIN
X`09Aclstr`20:=`20'(IDENTIFIER='`20+`20New_User`20+`20',ACCESS=READ+WRITE)'`20;
V
X`09Rst`20:=`20$PARSE_ACL`20(Aclstr`20:=`20SUBSTR`20(Aclstr.BODY,1,Aclstr.LENGT
VH),
X`09`09`09`20`20`20Aclent`20:=`20%STDESCR`20Aclent)`20;
X`09IF`20NOT`20ODD`20(Rst)`20`20THEN
X`09`20`20`20LIB$SIGNAL`20(Rst)`20;
X
X`09Item_List`5B1`5D.Buffer_Length`20:=`20INT`20(Aclent`5B1`5D)`20;
X`09Item_List`5B1`5D.Item_Code`09`20`20`20:=`20ACL$C_ADDACLENT`20;
X`09Item_List`5B1`5D.Buffer_Addr`20`20`20:=`20IADDRESS`20(Aclent)`20;
X`09Item_List`5B1`5D.Return_Addr`20`20`20:=`200`20;
X`09END`20;
X
X`20`20`20`20`20Rst`20:=`20$CHANGE_ACL`20(Objtyp`20:=`20ACL$C_LOGICAL_NAME_TABL
VE,
X`09`09`09`20Objnam`20:=`20'LNM$JOB',
X`09`09`09`20Itmlst`20:=`20Item_List)`20;
X`20`20`20`20`20IF`20NOT`20ODD`20(Rst)`20`20THEN
X`09LIB$SIGNAL`20(Rst)`20;
X`20`20`20`20`20END`20;
X`20`20END`20;`20`09`7B`20of`20Kangaroo`20`7D
X
X
XPROCEDURE`20Display_Jump`20;
X
X`7B`20Display`20data`20about`20the`20requested`20jump.`20`7D
X
X`20`20BEGIN`20`09`7B`20Display_Jump`20`7D
X`20`20IF`20Transmute`09THEN
X`20`20`20`20`20BEGIN
X`20`20`20`20`20WRITELN`20('%JUMP-S-JUMPED,`20',User,'`20jumped`20to`20',
X`09`20`20`20`20`20`20New_User,'`20(',Uic_Str,Eq_Id_Str,')')`20;
X`20`20`20`20`20WRITELN`20('%JUMP-I-DEFAULT,`20Default`20is`20',Def_Dev,Def_Dir
V)`20;
X`20`20`20`20`20END`20;
X
X`20`20IF`20Alter_Ego`09THEN
X`20`20`20`20`20WRITELN`20('%JUMP-S-SETUSER,`20Changed`20username`20from`20',Us
Ver,'`20to`20',New_User)`20;
X`20`20END`20;`20`09`7B`20of`20Display_Jump`20`7D
X
X
X`7B`20*`20*`20*`20*`20*`20*`20*`20*`20*`20*`20*`20*`20*`20*`20*`20*`20*`20*`20
V*`20*`20*`20*`20*`20*`20*`20*`20*`20*`20*`20*`20*`20*`20*`20*
X`20`20*`20*`20*`20*`20*`20*`20*`20*`20*`20*`09M`20A`20I`20N`20`20`20P`20R`20O
V`20G`20R`20A`20M`20`20`20*`20*`20*`20*`20*`20*`20*`20*`20*`20*
X`20`20*`20*`20*`20*`20*`20*`20*`20*`20*`20*`20*`20*`20*`20*`20*`20*`20*`20*`20
V*`20*`20*`20*`20*`20*`20*`20*`20*`20*`20*`20*`20*`20*`20*`20*`20`7D
X
X
XBEGIN`09`7B`20Jump`20`7D
X
XRst`20:=`20LIB$GET_FOREIGN`20(%DESCR`20Command)`20;
XIF`20NOT`20ODD`20(Rst)`20`20THEN
X`20`20`20LIB$SIGNAL`20(Rst)`20;
X
XIF`20NOT`20Check_Authority`09THEN
X`20`20`20BEGIN
X`20`20`20Audit_Jump`20(FALSE)`20;
X`20`20`20$EXIT`20(SS$_NOPRIV)`20;
X`20`20`20END`20;
X
XIF`20Get_And_Parse_Command`20`20THEN
X`20`20`20BEGIN
X`20`20`20Validate_User_Record`20;
X`20`20`20IF`20Alter_Ego`20`20THEN
X`20`20`20`20`20`20Wallaby`20;
X`20`20`20IF`20Transmute`20`20THEN
X`20`20`20`20`20`20BEGIN
X`20`20`20`20`20`20Kangaroo`20;
X`20`20`20`20`20`20Audit_Jump`20(TRUE)`20;
X`20`20`20`20`20`20END`20;
X`20`20`20IF`20Log`20`20THEN`20`20Display_Jump`20;
X`20`20`20END`20;
X
XEND.`09`7B`20of`20it`20all`20`7D
$ call unpack JUMP.PAS;1 4380753 "" 51 5 6
$!
$ create 'f'
XMODULE`20Jump_CLD
X
XDEFINE`20VERB`20JUMP
X
X`20`20`20`20`20`20`20PARAMETER`20`20P1,`20LABEL=USERNAME,`20VALUE`20(TYPE=$QUO
VTED_STRING),
X`09`09`20`20`20`20`20`20PROMPT="Username"
X
X`20`20`20`20`20`20`20QUALIFIER`20`20ALL,`20NEGATABLE
X`20`20`20`20`20`20`20QUALIFIER`20`20LOG,`20NEGATABLE,`20DEFAULT
X`20`20`20`20`20`20`20QUALIFIER`20`20OVERRIDE_UAF,`20NEGATABLE
X`20`20`20`20`20`20`20QUALIFIER`20`20SETUSER,`20NEGATABLE
X
X`20`20`20`20`20`20`20DISALLOW`20`20ALL`20AND`20SETUSER
X`20`20`20`20`20`20`20DISALLOW`20`20OVERRIDE_UAF`20AND`20NOT`20SETUSER
$ call unpack JUMP_CLD.CLD;1 694237668 "" 1 6 6
$ v=f$verify(v)
$ exit


