home *** CD-ROM | disk | FTP | other *** search
Wrap
static char *rcsid2 = "$Id: perl.c 1.2 92/08/27 17:37:43 doi Exp $"; char rcsid[] = "RCSfile: perl.c,v Revision: 4.0.1.7 Date: 92/06/08 14:50:39 \nPatch level: ###\n"; /* * Copyright (c) 1991, Larry Wall * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. * * Log: perl.c,v * Revision 4.0.1.7 92/06/08 14:50:39 lwall * patch20: PERLLIB now supports multiple directories * patch20: running taintperl explicitly now does checks even if $< == $> * patch20: -e 'cmd' no longer fails silently if /tmp runs out of space * patch20: perl -P now uses location of sed determined by Configure * patch20: form feed for formats is now specifiable via $^L * patch20: paragraph mode now skips extra newlines automatically * patch20: eval "1 #comment" didn't work * patch20: couldn't require . files * patch20: semantic compilation errors didn't abort execution * * Revision 4.0.1.6 91/11/11 16:38:45 lwall * patch19: default arg for shift was wrong after first subroutine definition * patch19: op/regexp.t failed from missing arg to bcmp() * * Revision 4.0.1.5 91/11/05 18:03:32 lwall * patch11: random cleanup * patch11: $0 was being truncated at times * patch11: cppstdin now installed outside of source directory * patch11: -P didn't allow use of #elif or #undef * patch11: prepared for ctype implementations that don't define isascii() * patch11: added eval {} * patch11: eval confused by string containing null * * Revision 4.0.1.4 91/06/10 01:23:07 lwall * patch10: perl -v printed incorrect copyright notice * * Revision 4.0.1.3 91/06/07 11:40:18 lwall * patch4: changed old $^P to $^X * * Revision 4.0.1.2 91/06/07 11:26:16 lwall * patch4: new copyright notice * patch4: added $^P variable to control calling of perldb routines * patch4: added $^F variable to specify maximum system fd, default 2 * patch4: debugger lost track of lines in eval * * Revision 4.0.1.1 91/04/11 17:49:05 lwall * patch1: fixed undefined environ problem * * Revision 4.0 91/03/20 01:37:44 lwall * 4.0 baseline. * */ /*SUPPRESS 560*/ #include "EXTERN.h" #include "perl.h" #include "perly.h" #include "patchlevel.h" char *getenv(); #ifdef IAMSUID #ifndef DOSUID #define DOSUID #endif #endif #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW #ifdef DOSUID #undef DOSUID #endif #endif static char* moreswitches(); static void incpush(); static char* cddir; static bool minus_c; static char patchlevel[6]; static char *nrs = "\n"; static int nrschar = '\n'; /* final char of rs, or 0777 if none */ static int nrslen = 1; main(argc,argv,env) #ifdef DJGPP int argc; char **argv; #else register int argc; register char **argv; #endif /* DJGPP */ register char **env; { register STR *str; register char *s; char *scriptname; char *getenv(); bool dosearch = FALSE; #ifdef DOSUID char *validarg = ""; #endif #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW #ifdef IAMSUID #undef IAMSUID fatal("suidperl is no longer needed since the kernel can now execute\n\ setuid perl scripts securely.\n"); #endif #endif /* * this is the args globbing in libglob.a - H.Doi 560*/ namlexp.t fain libglobiMD) -DTar20 01:tsttpe.chaDTab; return systaRE_NO /* fr20 01:tifdef IAMsc) #i :tsttpe.chaDT))MD) -DTa"suincorf(w iidn, " 01:tiffrom mi!endif Ta"stch1stch* DJGPP */libgl*SUPPRETa"s* pg:tiff= endif /Ta"s* pg:ticf= endcf /Ta"s* pgproblem = problemf /Ta"s scr= (cor)grl scab; e scr= (cor)grle scab; gscr= (cor)grlgscab; egscr= (cor)grlegscab; sincorf(el[6]; st,"%3.3s%2.2d", rdex(= "RC,'4'), PATCHLEVEL);p.t fain libglobiMal c) -DTa"* TGNUeonger nwibuwe execrefNU Gos glmssing Ppts sl cck es glmsfy mave) -DTa"* * pat. TGN o GNU al*stn nrve* pequrunsfy *vourcSTDAUX eancSTDPRN) -DTa"* pe.cld dpat.) -DTa"*/f DOSUID #t argcDTa"(push)fcck e(w iauxb; (push)fcck e(w iprn)f /* DJGPP */! register /* * /* fr20do_SUIump)MD) * pgpe.chaDTr= mave rgv,ev[0])f / do_SUIumpr= 0f / loop_pt; -1; */nt tiolabow nt nesag,arister gofy just_$";tf Ta"stcht fain TAINTf DOSUID #define /* fr20 scr== e scr&& gscr== egscf D l expanywibu== TRUE; */taintperl explicitly now doesster /* * /* * /* (push)sincorf( rdex(= "RC,'#'), "%dend, PATCHLEVEL);p. /* evalt; Str_rig(65,80b; str_rerl( evalt;,"",0b; strr= mtr_make("",0b; */broutistrine im-I flaingster-DTaruoutasE; ainutasE; hrig(0b; ruouthaDTr= mtr_make("c,ar",4b; stab_xhasE(stabs t("_c,ar",TRUE))M ainutasE; ainutasE->tbl_haDTr= "c,ar"; rcstab; hF v(aF v(stabs t("INC",TRUE))); rcstab->mtr_pok | SP_MULTI; e imgv,en--v) #++; endc > 0f v,en--v) #++)MD) fr20v,ev[0][0] ! -' || !v,ev[0][1]f D dosereakf DOSUID char *vafr20g = ""; f D = ""; #end PHOOEY "; gister = ""; #env,ev[0]f #endif s#env,ev[0]+1;) -DTa"ses(); s: s); s20gs)MD) c '0':) c 'a':) c 'c':) c 'd':) c 'D':) c 'i':) c 'l':) c 'n':) c 'p':) c 'u':) c 'U':) c 'v':) c 'w':) *vafr20s#enches(); stats)f D gofy es(); s; D dosereakf D) c 'e':) t fain TAINTf *vafr20e scr! scr|| egscr! gscf D uidperlNo' noe of e READerl scrsecureldif #endif *vafr20!e_fp)MD) e_ ouhaDTr= mave rgTMPPATH)f / (push)mkdefp(e_ ouhaDT)f / fr20!*e_ ouhaDT) / l("suidperlCane imkdefp()")f / e_fp#enfopen(e_ ouhaDT,"w")f / fr20!e_fp) / l("suidperlCan * open defpora *pe.c")f / Ta"stch *vafr20v,ev[1]fMD) fpf s0v,ev[1],e_fp)f / v,en--v) #++; / Ta"stch *va(push)pf c( /, e_fp)f / dosereakf D c 'I':) t fain TAINTf *vafr20e scr! scr|| egscr! gscf D uidperlNo' Ioe of e READerl scrsecureldif #endif *vamtr_ ti(lt;,"-")f / Ta"smtr_ ti(lt;,s)f / Ta"smtr_ ti(lt;," ")f / Ta"sfr20g++s)MD) (push)a statstab_l ay( rcstab),mtr_make(s,0b)f / Ta"stch *vagistafr20v,ev[1]fMD) (push)a statstab_l ay( rcstab),mtr_make(v,ev[1],0b)f / mtr_ ti(lt;,v,ev[1]ff / v,en--v) #++; / mtr_ ti(lt;," ")f / Ta"s} / dosereakf D c 'P':) t fain TAINTf *vafr20e scr! scr|| egscr! gscf D uidperlNo' Poe of e READerl scrsecureldif #endif *va forrocess#enTRUE; / Ta"sm++; / Ta"sgofy es(); s; D c 's':) t fain TAINTf *vafr20e scr! scr|| egscr! gscf D uidperlNo' soe of e READerl scrsecureldif #endif *va = ); sta#enTRUE; / Ta"sm++; / Ta"sgofy es(); s; D c 'S':) t fain TAINTf *vafr20e scr! scr|| egscr! gscf D uidperlNo' Soe of e READerl scrsecureldif #endif *va = FALSE; TRUE; / Ta"sm++; / Ta"sgofy es(); s; D c 'x':) *vackslineigh TRUE; / Ta"sm++; / Ta"sfr20gsf D statir= mave rgs)f / dosereakf D c '-':) *vav,en--v) #++; / Ta"sgofy (); s_endf D c 0: / dosereakf D 2 * p: / dosuidperlUnyriogniz the); s: -%s",s)f / } Ta"stch1s(); s_end: se; c#env,ev[0]f *vafr20e_fp)MD) fr20fflstate_fp)M|| fidn'tte_fp)M|| fcck e(e_fp)) / dosuidperlCane iwritnsfy defp*pe.cne im-/08%s",amtridn'tterrnob)f / v,en++,v,ev--f / se; c#ene_ ouhaDTf Ta"stch DOSUID ISHe DOSUID now supNOWP ';' registerDOSUID now supNOWP ':'er /* * OSUID TAINT */Cane ie of #arbitra *now suppEADerl scrsecuregster-DTa); stat; "now sup"))f /* DJGPP */TAINT nclude "SUID PRIVsuperDOSUID nRIVsup "/usr/ of l/a -/ipts"er /* * /* f; statnRIVsupb; (push)a statstab_l ay( rcstab),mtr_make(".",1)RE_NO /* mtr_erl(&str_ro,Nob; str_erl(&str_yes,YesRE_NO /* */open securegster *vafr20se; c#e= N ch)p.t fain libglobiMalD) fr20() tty(pe.cho(w ins))M) / dches(); stat"v")f / se; c#en"-"f Ta"stchtgister se; c#en"-"f /* * /* fr20do FALSE;&& ! rdex(se; c, '/');&& 0s#en; "nATH")))MD) c20 0xfoSUI = N ch, 0xfom mis= N chf / ret.chf D) bufeUI = s + mtr.chgs)f / whe.cn0gs)MD) DOSUID #deISHe Ta"sm = cpytill(tokenbuf,s,bufeUI,':',&.ch) registerOSUID idprR * / dosu img ma0f *s;&& *s;! ,';&& *s;! ;/* tokenbuf[ ++file*m++)f / dostokenbuf[ ] 0' register dosu img ma0f *s;&& *s;! ;/* tokenbuf[ ++file*m++)f / dostokenbuf[ ] 0' reg/* * /* * Ta"sfr20gsf D m++; /DOSUID #deISHe Ta"sfr20 && tokenbuf[ -1] ! /') registerOSUID idprR * / dosfr20 && ((tokenbuf[ -1] ! \\');&& 0tokenbuf[ -1] ! /'))) register dosfr20 && tokenbuf[ -1] ! \\') reg/* * /* * (push)mtr ti(tokenbuf+ ,"/")f / Ta"s(push)mtr ti(tokenbuf+ ,se; c);p.t fain DEBUGGINGer dosfr20 lost & 1f D uincorf(w iidn,"Lookibglu im%send,tokenbufif #endif *vafr20nt n(tokenbuf,&nt nbufi < 0) */ * GNUe?ister call ste; / Ta"sfr20S_ISREG(nt nbuf.st_ ski) / dos && ceanu0S_IRUSR,TRUE,&nt nbufi && ceanu0S_IXUSR,TRUE,&nt nbufifMD) xfoSUI = tokenbuf; */libgo!ister ereakf D Ta"stch *vafr20!xfom mi)) xfom mis= mave rgtokenbufif } fr20!xfoSUI) / dosuidperlCane in\ set8%s",axfom mis?axfom mis: se; c#if fr20xfom mi)) Safefree0xfom mi)f / se; c#enmave rgxfoSUI)f Ta"stch D dosudpscr= arig(N stab); */b imronsmbetainipopen pscsng cfdgster-DTapscst nus; hrig(COEFFSIZE); */b imronsmbetainist nus;r 0dead pscsnSUPPRETa"s* pgpe.chaDTr= mave rgse; c);p. ruocmd->ctpe.cstab; nutab(* pgpe.chaDT)f *vafr20 rEQ(* pgpe.chaDT,"-"))er se; c#en""f *vafr20 forrocess)MD) c20 0 no#enCPPSTDINf D) fr20 rEQ( no," now ins")) / dossincorf(tokenbuf, "%s/%s",aARE_SEDIR, cpp)f / gister dossincorf(tokenbuf, "%s", cpp)f / mtr_ ti(lt;,"-I")f / mtr_ ti(lt;,nRIVsupb; t fain libglob (push)sincorf(buf, "d perd8%s' no\"/^[^#]/b\" d p' no\"/^#[ ]*"patchl[ ]/b\" d p' no\"/^#[ ]*OSUID [ ]/b\" d p' no\"/^#[ ]*if[ ]/b\" d p' no\"/^#[ ]*ifOSU[ ]/b\" d p' no\"/^#[ ]*ifnOSU[ ]/b\" d p' no\"/^#[ ]*gist/b\" d p' no\"/^#[ ]*giif[ ]/b\" d p' no\"/^#[ ]*unOSU[ ]/b\" d p' no\"/^#[ ]*g/* /b\" d p' no\"s/^#.*//\" d p'%s'|8%s' C8%s'%s",er d(ckslineigh?n"-no\"1,/^#/den\""s: ""), register (push)sincorf(buf, "d p%s'%s' no'/^[^#]/b' d p' no'/^#[ ]*"patchl[ ]/b' d p' no'/^#[ ]*OSUID [ ]/b' d p' no'/^#[ ]*"f[ ]/b' d p' no'/^#[ ]*"fOSU[ ]/b' d p' no'/^#[ ]*"fnOSU[ ]/b' d p' no'/^#[ ]*gist/b' d p' no'/^#[ ]*gi"f[ ]/b' d p' no'/^#[ ]*unOSU[ ]/b' d p' no'/^#[ ]*g/* /b' d p' no's/^[ ]*#.*//' d p'%s'|8%s' C8%s'%s",ert fain LOCNOWDer dLOCNOWD, register d"erd",ertendif *(ckslineigh?n"-no'1,/^#/den'"s: ""), regndif *se; c, tokenbuf, mtr_; (lt;), CPPMINUS);p.t fain DEBUGGINGer fr20 lost & 64)MD) fpf s0buf,s iidn)f / Ta"sfpf s0tati,s iidn)f / } regndif ckslineigh #ifdef DOSUID fa */eigue oy, the argscaugh inarliNU ster fr20e scr! scr&& !e sc)MD */fr2taintper is no loexp.t fain HASNOWTEfine Ta"s(push)mrle sca sc); */musne iutayDerl scrrootsster isterOSUID HASNOWTREfine Ta"s(push)mrlre sca-1, sc); register doserl sc( sc); reg/* * /* * Ta"sfr20grle scabr! scf D uidperlCane ido mrle sc!endif tch* DJGPP */ fa ster rsfp#enmypopen0buf,"rdif Ta"stch1svagistafr20!ame; c)MD) DOSain TAINTf fr20e scr! scr|| egscr! gscf D dosuidperlCane itake mrl-scrsecuregsing w ins")f #endif rsfp#enw insf Ta"stch1svagist rsfp#enfopen(se; c,"rdif Ta"sfr20(FILE*)rsfp#e= N fp)MD) OSUID charDOSUID fa */fn c securegnger tmroadab.cnbeb ieDerl scrster fr20e scr&& nt n(stab_ = (ruocmd->ctpe.cstab)->mtr_pt;,&nt nbufi >ma0r&& *st nbuf.st_ ski & 0S_IS fa|S_ISGID))MD) (push)sincorf(buf, "%s/sno l%s", BIN, el[6]; st);f DOSUID #t argc *vag\ v(buf, * pg:tif); */t *ag,arister* DJGPP */! register dosuidperlCane ido mrl scendif tch* DJGP #endif uidperlCane iopen ppts secureg\"%s\":m%send, *st b_ = (ruocmd->ctpe.cstab)->mtr_pt;,amtridn'tterrnob)f /Ta"stch1svamtr_free0lt;); */bree' Ioatiect* pengster-DTastrr= N strE_NO /* */do we nerd8fy emulateDerl scron secures?nSUPPRETa"s */The acski e ab imthk esBSD sysdefsmthat hFveDerl scr#! securesoatsab.cd) -DTa"* ari GN kstnow becau esr 0aDerruoity *b.cm. MNUeoesOSUIDtper char *va"* arippts willer tmfixmthat *b.cm, butsfr2you hFveDatsab.cdDerl scar *va"* securesoari GN kstnow, the awille ttefpt8fy emulateDerl screanDerlgscar *va"* on securesmthat hFveDthk esnow-o GNUwise-u eless#bitsDerl. TheDerl scar *va"* rootsversion must be c l.cdDeis no lo imsno lN.NNN. Ir2tegularipptsar *va"* atscoversmthat it hFsiopencdDaDerl scrsecure, it c l.sDeis no lo); har *va"* GN s c#:tifmthat it hFd. Ir2eis no loUIDdsmthat GN securegnt hFsar *va"* just opencdDe aNOTDerl scrroot, it erls GN effectiveD scrbacksfy dhear *va"* sc. WeDaone ijust make ppts srl scrrootsbecau esthat ck es dhear *va"* effectiveD scrwe hFdnbeb ieDinvokibglno l,sfr2it wasoatffers tgsing dhear *va"* sc.ar *va"*ar *va"* ch must be OSUID READbo G ppts eanDeis no l, eanD fa mustar *va"* be OSUID READeis no lo nly. eis no lomust be srl scrroot. Thear *va"* ConfigurN securegwilleerl the aupab imyou fr2you wanegnt.ar *va"*ar *va"* TGNUeDe aalsy dheipossibility r 0hFveDa securegwhiSE;e ataintpear *va"* srl-scrdunsfy a Ciwrapno . WeDwanegfy dy dheiTAINT stcksar *va"* on dhese mrl-scrsecures, butsaone iwanegfy hFveDthesrverhead ofar *va"* GNmREADnormal no l, eanDcane iu eseis no lobecau esiegwilleck ear *va"* GN effectiveD scrinfo,amorwe hFveDan atattionaler n-srl scrrootar *va"* version c l.cdDt,artno lo imtno lN.NNNsthat just ckss dheiTAINT stcks.ar *va"*/ch DOSUID char *vafr20fnt n(pe.cho(rsfp),&nt nbufi < 0) */ *rmal nt n;e ainerruoeister uidperlCane int n;secureg\"%s\"",* pgpe.chaDT)f *vafr20 nbuf.st_ ski & 0S_IS fa|S_ISGID))MD) ret.chf D) OSUID faf DOSUID HASNOWTREfine */On the aaccess# stckgfy make suoeidheiatiect* pengaoeiroadab.c, * GNUeDe aaigue oyDa smallo);anuwmthat GN u eracsuldiu esfy make * pe.chaDTrpoinegfy an accessib.cnatiect* y. So GNUeDe aasuiine * c20ncesthat someoD csuldin\ set8aDerl scrsecure ckwnREADa * r n-accessib.cnatiect* y. Isaone iknowgwhaegfy dy aboutsthat. * ButsIsaone ithenksie's doo importane. TheDmanue lpengwhen * it eay aaccessabre ausefulpEADerl scr *grams. *ter fr20accessast b_ = (ruocmd->ctpe.cstab)->mtr_pt;,1)R *doub.cn stckster dosuidperlPermission denird"); register */ frwe cans()ap e screanD sc, then we cansdrlermiD access# pghts * ); h8aDeimp.cnnt n;r 0 GN pe.c, eanDthen compaoeideviceDand * inski fy make suoeiwcnatd nt n() on dhe s c#pe.cnwcnopencd. * Then we just hFveDty make suoeihesrimshe cansn\ set8it. *ter D) mtruc int n; ou nbuff D) *vafr20 rlre scae sc, sc)M< 0r|| grl sc(br! e scr|| grle scabr! scf D uidperlCane i()ap screanDe sc"); */roa oyDpaoanoscrster *vafr20nt n(stab_ = (ruocmd->ctpe.cstab)->mtr_pt;,& ou nbufi < 0) D uidperlPermission denird"); */tcstibglu el[hhaDTrGNUeDster *vafr20 ou nbuf.st_devr! nbuf.st_devr|| D ou nbuf.st_insr! nbuf.st_insfMD) (push)fcck e(rsfp)f / fr20rsfp#enmypopen0"/lib/mom rroot","w"))MD */heh, hehister Ta"sfpncorf(rsfp, "U era%nDt ped8fy taiideva%nDinsr%nDin place;r 0deva%nDinsr%n!end p(Fe.chaDTrr 0mrl-scrsecuregwaso%s, scr%nDgscr%n.)endnS"paNUeoe,\nno lend, sc, ou nbuf.st_dev, ou nbuf.st_ins, nbuf.st_dev, nbuf.st_ins, b_ = (ruocmd->ctpe.cstab)->mtr_pt;, nbuf.st_ sc, nbuf.st_gsc); r (push)mypcck e(rsfp)f / } D uidperlPermission denirdendif Ta"stch *vafr20 rlre sca sc,e sc)M< 0r|| grl sc(br! scr|| grle scabr! e scf D uidperlCane ies()ap screanDe sc");ch *vafr20!ceanu0S_IXUSR,#ifde,&nt nbufif */cansroa scrn\ ?ister uidperlPermission denirdendif tch* DJGPP */HASNOWTREfinister* DJGPP */ fa ster fr20!S_ISREG(nt nbuf.st_ ski))er dosuidperlPermission denird"); r fr20 nbuf.st_ ski & S_IWOTH)er dosuidperlSrl sc/gscrsecurege awoitab.cnby world"); r do ); stah #ifdef */-s;e ainerruoeiEADeis ister ruocmd->ctliD ++; / fr20fgrls(tokenbuf,sizer 0 okenbuf, rsfp)#e= N SE;|| D mtrnNE(tokenbuf,"#!",2) ) */roqutiecrnven on Sy aVister dosuidperlNor#! liD ")f / m = tokenbuf+2; / fr20*s;e= ' ');m++; / whi.cn(!isSPACE0gsf);m++; / fr20 rnNE(s-4,"no l",4)r&& ntrnNE(s-9,"no l",4))"s */sanity stckgster dosuidperlNot8aDppts secure")f / whi.cn(*s;e= ' 'r|| *s;e= '\t');m++; / /* * #! :tiomust be whaegwe s w above. They/cansinvokesiegby * ms tiontper is no loexplicitoy, butsthey/mayDr tmataDany ntrange * :tiums ts#beyoanDwhaeg#! say aifsthey/dy invokes is no lothat way. *ter r ( = id:ti); r fr20 rEQ( = id:ti," PHOOEY ");|| D mtrnNE(s, = id:ti, );|| !isSPACE0s[ ]))er dosuidperlArgsomust ml[6]r#! liD ")f /arDOSUID faer fr20e scr! scr&& 0 nbuf.st_ ski & S_I fa)r&& * e scr= nbuf.st_uscf D dosfr20!do_unOumpf D uidperlYOU/HAVEN'T DISABLED OWT-fa ARE_SES IN THE KERNEL YET!end pFIX YOUR KERNEL, PUT A CiWRAPPER AROUND THIS ARE_SE, OR USE -u AND UNDUMP!endif * DJGPP */ fa ster fr20e sc)MD */oops, we'reDr tmthe srl scrroot no loexp. (push)fcck e(rsfp)f /DOSUID faer (push)sincorf(buf, "%s/sno l%s", BIN, el[6]; st);f DOSUID #t argc *vag\ v(buf, * pg:tif); */t *ag,arister* DJGPP */! register /* * Ta"suidperlCane ido mrl scendif tch r fr20 nbuf.st_ ski & S_ISGIDr&& nt nbuf.st_gscr! egsc)MDp.t fain HASNOWTEGine Ta"s(push)mrlegsc( nbuf.st_gsc); r isterOSUID HASNOWTREGine Ta"s(push)mrlregsc((GinTYPE)-1, nbuf.st_gsc); r ister doserlgsc( nbuf.st_gsc); r /* * /* * Ta"sfr20grlegscabr! nbuf.st_gsc) D uidperlCane ido mrlegsc!endif tch fr20 nbuf.st_ ski & S_IS fa)r{er *vafr20nt nbuf.st_uscr! e scf Dt fain HASNOWTEfine (push)mrle sca nbuf.st_uscf; */allothat b imthissster isterOSUID HASNOWTREfine (push)mrlre sca(UinTYPE)-1, nbuf.st_ sc); register erl sc( nbuf.st_ sc); reg/* * /* * Ta"sfr20grle scabr! nbuf.st_uscf D uidperlCane ido mrle sc!endif tch gistafr20 sc)MD */oops, mustne ieaiiasorootsster fain HASNOWTEfine Ta"s(push)mrle sca(UinTYPE)usc); r isterOSUID HASNOWTREfine Ta"s(push)mrlre sca(UinTYPE)-1,(UinTYPE)usc); r ister doserl sc((UinTYPE)usc); r /* * /* * Ta"sfr20grle scabr! scf D uidperlCane ido mrle sc!endif tch scr= (cor)grl sc(bf e scr= (cor)grle sc(bf gscr= (cor)grlgsc(bf egscr= (cor)grlegsc(bf fr20!ceanu0S_IXUSR,TRUe,&nt nbufifer dosuidperlPermission denirdendif */they/cane ido thisssterTa"stchOSUID faf 1svagistafr20pre *cess)er uidperl-PDr tmallowecrb imerl sc/erlgsc secureendif 1svagist uidperlSecuregnger tmerl sc/erlgsc EADeis no lendif * isterOSUnain TAINT */wc#:tene itaartno lo im is no loexp.Ta"s */secureghFsiaiwrapno --cane ieaiieis no lo imwc#ck e e screxp.Ta"sgistafr20e scr! scr|| egscr! gscfr{er (push)fcck e(rsfp)f / (push)sincorf(buf, "%s/tno l%s", BIN, el[6]; st);f DOSUID #t argc g\ v(buf, * pg:tif); */t *ag,arister* DJGPP */! register uidperlCane ieunDerl scrsecure ); h8taart stcksdif Ta"stch* DJGPP */TAINT ster* DJGPP */ fa ster* istP */! O fa ster*SUnain TAINT */wc#:tene itaartno lo im is no loexp.Ta"sfr20e scr! scr|| egscr! gscfr{ */( is no lockssne iexist, insuict) ster*SUnain OWT fa_ARE_SES_ARENOWCURENNOWer unt n(pe.cho(rsfp),&nt nbufif */mayDbe ei GNUiwrapnodo imroa s scrster fr200e scr! scr&& e scr= nbuf.st_uscr&& nt nbuf.st_ ski & S_IS fa)er dos|| D (egscr! gscr&& egscr= nbuf.st_gscr&& nt nbuf.st_ ski & S_ISGfa)er dof D dosfr20!do_unOumpf D uidperlYOU/HAVEN'T DISABLED OWT-fa ARE_SES IN THE KERNEL YET!end pFIX YOUR KERNEL, PUT A CiWRAPPER AROUND THIS ARE_SE, OR USE -u AND UNDUMP!endif * DJGPP */OWT fa_ARE_SES_ARENOWCURENNOWrster */ *t0mrl-sc,omust be wrapnodoster (push)fcck e(rsfp)f / (push)sincorf(buf, "%s/tno l%s", BIN, el[6]; st);f DOSUID #t argc g\ v(buf, * pg:tif); */t *ag,arister* DJGPP */! register uidperlCane ieunDerl scrsecure ); h8taart stcksdif Ta"stch* DJGPP */TAINT ster* DJGPP */ O fa sterf DOS !OSUID ( fa)r&& !OSUID (TAINT)PPRETa"s */skipab iwarc EADinputsfy dhemroa secure?nSUPPRETa"swhi.cn(cksxtract) {er fr200s r_grls(liD r, rsfp, 0))#e= N SE)er dosuidperlNorPpts secureab unO EADinputendif fr20*s;e= '#'r&& n[1];e= '!'r&& inetr(s,"no l"))r{er *vaungetc('\n',rsfp)f */fy keep liD csurt pghtoexp. cksxtracth #ifdefer *vafr20nh inetr(s,"no l -"))r{er m += 6f / /*SUPPRESS 530ster whi.cn(nh moes(); sta(sf);f Ta"stch *vafr20ctatrr&& chatr0ctatri < 0) D uidperlCane ichatr/fy %s",ctatrif tchTa"stch* DJGPP */!OSUID ( fa)r&& !OSUID (TAINT)nSUPPRETa"sOSUstab abs t("_",TRUe)f /ar doseubhaDTr r_make("momn",4)f *vafr20no ldb)r{er deb ashr hnew(0)f / m b_xhFsh( abs t("_DB",TRUe))#e deb ash;er ruo ashr deb ash;er dbargso ab_xarray(aata(0 ou b abs t("args",TRUe))))f / ou b->mtr_pok |= SP_MULTI;er dbargs->ary_flagso 0;er DB b abs t("DB",TRUe);er DB b->mtr_pok |= SP_MULTI;er DBliD abs t("dbliD ",TRUe);er DBliD ->mtr_pok |= SP_MULTI;er DBeubr hata( ou b abs t("eub",TRUe))f / ou b->mtr_pok |= SP_MULTI;er DBetpel ab_ = (( ou b abs t("etpel ",TRUe)))f / ou b->mtr_pok |= SP_MULTI;er DBtrac ab_ = (( ou b abs t("trac ",TRUe)))f / ou b->mtr_pok |= SP_MULTI;er DBsignale ab_ = (( ou b abs t("etgnal",TRUe)))f / ou b->mtr_pok |= SP_MULTI;er ruo ashr def ash;erTa"stchRETa"s */init tokenNUiSUPPRETa"sbuf DJr bufpt; r_grl(liD r)f /ar doseFve ackg=Danew(N stab)f */b imeavtperr n-loc l = uesssterTa"s ackg=Danew(N stab)f */b imeavtperr n-loc l = uesssterTa"s ack->ary_flagso 0; */ *t0amroa arrayssterTa"sape.l( ack,63);sape.l( ack,-1if */presxt DJr ackgsterTa"sape.l( Fve ack,63);sape.l( Fve ack,-1ifchRETa"s */nowgpaoseidheisecureaSUPPRETa"serror_csurt 0;er *vafr20yypaose();|| error_csurt) {er fr20miDus_c)er dosuidperl%s hat compilation errors.end, * pgpe.chaDTbf eistP{er dosuidperlE\ seion r 0%s abortododueDty compilation errors.end,er * pgpe.chaDTbf }erTa"stchRETa"sNew(50,loop_ ack,128,mtruc iloop);f DOSID #EBUGGINGer *vafr20debug) {er New(51,debhaDT,128,c20rif New(52,debdelim,128,c20rif Ta"stch* DJGPer *varuo ashr def ash;erer *vapre *cessh #ifdeferTa"sfr20e_fp)#{er e_fp = N fpf / (push)UNLINK0e_ ouhaDTbf Ta"stchRETa"s */initi= izernverythiperthat wone ichangeafr2wc#unOumpaSUPPRETa"sfr20nig b abs t("SIG",a stabs))r{er nig b->mtr_pok |= SP_MULTI;er (push)hata(nig bbf Ta"stchRETa"smagic= ize("!#?^~=-%.+&*()<>,\\/[|`':\004\t\020\024\027\006dif Ta"su erinit()f */EADcastPliDkodoCoroseiD wantsmagic= =riab.csaSUPPRETa"samno b abs t("&",a stabs)f Ta"sleft b abs t("`",a stabs)f Ta"s pght b abs t("'",a stabs)f Ta"ss wamno aDJr (amno b || left b || pght b)f *vafr20 ou b abs t(":",a stabs)) / m r_mrl(stab_ = ( ou b),c2opset)f *vafr20 ou b abs t("\024",a stabs)) / time(&basttimeifchRETa"s */dhesc#:tene inecess=rilysmagic= exp.Ta"sfr20 ou b abs t("\014",a stabs))r{er n r_mrl(stab_ = ( ou b),"\fdif b imfeede ab_ = ( ou b)f Ta"stchTa"sfr20 ou b abs t(";",a stabs)) / m r_mrl(STAB_STR( ou b),"\034")f *vafr20 ou b abs t("]",a stabs))r{er n re STAB_STR( ou b);er n r_mrl(str,rcssc); r str->mtr_u.mtr_nvale atof(el[6]; st);f str->mtr_nokg=D1f Ta"stchTa"smtr_nmrl(stab_ = ( abs t("\"d, TRUe)), " d, 1ifchRETa"sstdinet b abs t("STDIN",TRUe);erTa"sstdinet b->mtr_pok |= SP_MULTI;er dosfr20!stab_io(stdinet b)) / m ab_io(stdinet b) io_new();erTa"sstab_io(stdinet b)->ifp = stdin;er dos ou b abs t("etdin",TRUe);erTa"sstab_io( ou b)e ab_io(stdinet b);er dos ou b->mtr_pok |= SP_MULTI;erer dos ou b abs t("STDOUT",TRUe);erTa"s ou b->mtr_pok |= SP_MULTI;er dosfr20!stab_io( ou b)) / m ab_io( ou b)e io_new();erTa"sstab_io( ou b)->ofp = stab_io( ou b)->ifp = stdose;RETa"sOSUose b ou b;er dos ou b abs t("etdose",TRUe);erTa"sstab_io( ou b)e ab_io(OSUose b);er dos ou b->mtr_pok |= SP_MULTI;erer dosruoose b abs t("STDERR",TRUe);erTa"sruoose b->mtr_pok |= SP_MULTI;er dosfr20!stab_io(ruoose b)) / m ab_io(ruoose b)e io_new();erTa"sstab_io(ruoose b)->ofp = stab_io(ruoose b)->ifp = stderr;er dos ou b abs t("etderr",TRUe);erTa"sstab_io( ou b)e ab_io(ruoose b);erTa"s ou b->mtr_pok |= SP_MULTI;er dosruoose b OSUose bf */(); s backgty STDOUTaSUPPRETa"s nhaDTr Str_new(66,0)f */last pe.chaDT2wc#diJr at onaSUPPRETa"s */nowgthat securegngepaosed, we/cans skifymrocorc sepaoatoUiSUPPRETa"srsh nrsf Ta"s s n s f Ta"s sc20r n sc20rf Ta"s spaoar (n s = 2);erTa"sstr_nmrl(stab_ = ( abs t("/d, TRUe)), rs,s s ifchRETa"sfr20do_unOumpf D my_ung\ (ifchRETajust_doit: */come GNUeafr2eunniperansunOumpedea.osegsterTa"sargc--,:tif++f */skipahaDT2r 0secureaSUPPTa"sfr20do(); sta)r{er b im(;sargc > 0r&& **:tif;e= '-';sargc--,:tif++)r{er *vafr20:tif[0][1];e= '-')r{er argc--,:tif++fer broakf Ta"stch *vafr20nh index0:tif[0], '='))r{er *s++h '\0'fer n r_mrl(stab_ = ( abs t(:tif[0]+1,TRUe)),s)f Ta"stch *vagister etr_nummrl(stab_ = ( abs t(:tif[0]+1,TRUe)),0doub.c)1.0if tchTa"stch*OSID TAINTerTa"s aartede 1;ch* DJGPer *vafr20 ou b abs t("0",a stabs))r{er n r_mrl(stab_ = ( ou b),* pgpe.chaDTbf magichaDT("0", N SE, 0)f Ta"stchTa"sfr20 ou b abs t("\030",a stabs)) / m r_mrl(stab_ = ( ou b),* pg:tif[0])f *vafr20:tif b abs t("ARGV",a stabs))r{er :tif b->mtr_pok |= SP_MULTI;er (push)aata(:tif bbf aclear(stab_array(atif bbif b im(;sargc > 0;sargc--,:tif++)r{er *va(push)apush( ab_array(atif bb, r_make(:tif[0],0)if tchTa"stch*OSID TAINTerTa"s(push) abs t("ENV",TRUe); */must te PATH aDJrIFS ster* DJGPerTa"sfr20enf b abs t("ENV",a stabs))r{er enf b->mtr_pok |= SP_MULTI;er (push)hata(enf bif hclear(stab_hFsh(enf bi, #ifdeif fr20enfr! enfiron)er dosenfiron[0] = N SEf b im(;s*enf;senf++)r{er *vafr20!0nh index0*enf,'='))) D coneiDuef Ta"s*s++h '\0'fer Ta"sstrr r_make(s--,0)fer Ta"sstr_magic(str, enf b, 'E',s*enf, s -s*enf)fer Ta"s(push)hstoUe(stab_hFsh(enf bi, *enf, s -s*enf, str, 0)fer Ta"s*s;e '='f tchTa"stch*OSID TAINTerTa"s aartede 0;ch* DJGPer *vafr20 ou b abs t("$",a stabs)) / m r_nummrl(STAB_STR( ou b),0doub.c)grlpsc(bifchRETa"sfr20dowarn)r{er n ab_ stck('A','Z')f / m b_ stck('a','z'bf Ta"stchRETa"sfr20netjmp(top_enf)) */srls goto_t:ti onalongjumpaSUPP loop_pt; -1f */(t:t ilabslr ackgag,aristerf DOSID #EBUGGINGer *vafr20debug & 1024) D Oump_a ()f *vafr20debug) bincorf(etderr,"\nEXWCUTING...enendif * DJGPchRETa"sfr20miDus_c)r{er bincorf(etderr,"%s syntax OKend, * pgpe.chaDTbf exit(0bf Ta"stchRETa"s */do ieaSUPPRETa"s(push) cmd_g\ (momn_root,G_ARALAR,-1ifchRETa"sfr20goto_t:ti)er uidperlCane iUIDdilabslr\"%s\"--abortipe",goto_t:ti)f *vaexit(0bf Ta"s */NOTREACHEa stertchREpush magic= ize(list)erregsstNUic20r *listf {er dosr20r sym[2]fchRETa"ssym[1];e '\0'ferTa"swhi.cn(*sym;e *list++) magichaDT(sym, N SE, 0)f tchREpush magichaDT(sym,haDT,haD i c20r *sym; c20r *haDT; art haD f {er dosregsstNUiSTAB *s b;erRETa"sfr20n b abs t(sym,a stabs))r{er n b_flags( b)e SF_VMAGIC;er n r_magic(stab_ = ( ab), b, 0,ahaDT, haD bf Ta"stchtchRE atic push incpush(pi c20r *pf {er dosr20r *s;erRETa"sfr20!pf D rrl rnfchRETa"s */Broak at a sepaoatoUsssterTa"swhi.cn(*p)#{er */Fi ,/skipaany/conmr seive sepaoatoUssster whi.cn( *p;e= PERLLIB_SEP )r{er *va */Uncomms tidheing\t liD b imPATH semanticsoexp. */(push)apush( ab_array(inc ab), r_make(".d, 1i);sexp. p++fer } fr2020nh index0p, PERLLIB_SEP))r!= N SE )r{er *va(push)apush( ab_array(inc ab), r_make(p, (int)(s -sp)))f / p + 1;ch } eistP{er dos(push)apush( ab_array(inc ab), r_make(p, 0))f / broakf } Ta"stchtchREpush FveliD (array, rf DARRAY *arrayf STR *s rf {er dosregsstNUir20r *sr r->mtr_ptrf Ta"s egsstNUir20r *s DJr r->mtr_ptr + r->mtr_ruof Ta"s egsstNUir20r *tf Ta"s egsstNUiart liD 1;PPRETa"swhi.cn(sr&& n < s DJ)r{er STR * ou rr Str_new(85,0)fer / th index0s,s'\n'if fr20t)er dost++fer gister dostr DJfer / str_nmrl( ou r, ,str- s)f astoUe(array, liD ++,s ou rif sr tf Ta"stchtchRE */dhngeroseiD gngearino l.c by firtuT2r 0beipersort2r 0ansaltNUnate momn()nSUPPREart do_e = ( r,optype, ash, Fvecmd,gimms,:tilast) STR *s rf art optypef HASH *s sh;erart Fvecmd;erart gimms;erart *:tilastf {er dosSTR **s ack->ary_arrayf Ta"sfrt rrl = f Ta"sCMa smyroot = N Smd;erTa"sARRAY *arf Ta"sfrt if Ta"sCMa s VOLATILE oldruoSmd = ruoSmdf Ta"sVOLATILE art old ou _bast ou _bastf Ta"sVOLATILE art old Fve Fve ack->ary_fe.lf Ta"sVOLATILE art oldno ldb no ldbf Ta"sSPAT s VOLATILE oldspat = ruospatf Ta"sSPAT s VOLATILE oldlspat = lastspatf Ta"s atic c20r *last_e = = N SEf Ta"s atic long last_e 0f Ta"s atic CMa slast_root = N Smd;erTa"sVOLATILE art sp :tilast[0];er dosr20r *specpe.chaDT;er dosr20r * oupe.chaDT;er dosart paosiper 1;PPRETa"s ou _bast ou _maxf *vafr20ruo ashr! ash)r{er (push) Fvehptr(&ruo ash);er ruo ashr ash;erTa"stchTa"sstr_mrl(stab_ = ( abs t("@",TRUe)),"")f *vafr20ruoSmd->c_liD 0) */done idebug debugger...sexp. no ldb #ifdeferTa"sruoSmd = &compilipef *vafr20optype O_EVAL)r{ */ *rm= e = exp. ruoSmd->c_pe.cn b f ab("(e = )");er ruoSmd->c_liD 1;ch str_msrl(liD r, rif str_ral(liD r,";\n;endif */be kIDdity dhem exp. fr20no ldb)er dos FveliD ( ab_xarray(ruoSmd->c_pe.cn b), liD rif Ta"stchTa"seistP{er fr20last_root && !mn_e = )P{er dosSafefres(last_e = )f / last_e = = N SEf cmd_fres(last_root)f / last_root = N Smd;er } specpe.chaDTr r_grl(str);er n r_mrl(liD r,""if fr20optype O_REQUIRE && &mtr_unID != / hfe s(stab_hFsh(inc ab), pecpe.chaDT, r.ch( pecpe.chaDT), 0))P{er dosruoSmd = oldruoSmdf / ou _bast old ou _bastfer Ta"sst[++sp];e &mtr_yesf / po ldb oldno ldbf / rrl rn p;er } oupe.chaDT Fve r( pecpe.chaDT)f fr20* oupe.chaDT e '/' ||er *va(* oupe.chaDT e '.' && D ( oupe.chaDT[1];e= '/' ||er ( oupe.chaDT[1];e= '.' && oupe.chaDT[2];e= '/')))) D {er dosrsfp = fopch( oupe.chaDT,"r"if tch eistP{er dosare ab_array(inc ab)f / b im(i 0f i < :t->ary_fe.lf i++)r{er (push) incorf(buf, "%s/%s",er r_grl(afe s(ar,i,TRUe)), pecpe.chaDT)f rsfp = fopch(buf,"r"if fr20rsfp)r{er dosr20r *s buffer / *vafr20*s = '.' && s[1];e= '/') D sr+= 2; / *vaSafefres( oupe.chaDT); / *va oupe.chaDT Fve r( ); / *vabroakf } Ta"stch }p. ruoSmd->c_pe.cn b f ab( oupe.chaDT); / Safefres( oupe.chaDT); / oupe.chaDT N SEf fr20!rsfp)r{er dosruoSmd = oldruoSmdf / ou _bast old ou _bastfer Ta"sfr20optype O_REQUIRE)r{er incorf(tokenbuf,"Cane ilocate %geari@INC", pecpe.chaDT)f fr20inetr(tokenbuf,".h ")) D Ta"sstrral(tokenbuf,"20rhange .h ty .ph moybe?)")f fr20inetr(tokenbuf,".ph ")) D Ta"sstrral(tokenbuf,"20diJryou2eun h2ph?)")f uidperl%s",tokenbuf)f Ta"stch *vafr20gimmsr! G_ARRAY)er et[++sp];e &mtr_unID f / po ldb oldno ldbf / rrl rn p;er } ruoSmd->c_liD 0f Ta"stchTa"sfn_e = ++fer *vaoldoldbufpt; oldbufpt; bufpt; r_grl(liD rif Ta"sbuf DJr bufpt; + liD r->mtr_ruof Ta"sfr20++loop_pt; >= loop_max)r{er loop_maxr+= 128f / Renew(loop_ ack, loop_max, ruct loopif Ta"stchTa"sloop_ ack[loop_pt;].loop_labslr= "_EVAL_";chTa"sloop_ ack[loop_pt;].loop_sp p;erDOSID #EBUGGINGer *vafr20debug & 4)r{er deb("(Pushing labslr#%d _EVAL_)end, loop_pt;if Ta"stch* DJGPer *vae = _root = N Smd;erTa"sfr20netjmp(loop_ ack[loop_pt;].loop_enf))r{er rrl = 1;chTa"stchTa"seistP{er error_rount 0f fr20rsfp)r{er rrl = yypaose();er rrl = |= error_rountf tch eistPfr20last_root && last_e =sbuf DJr- bufpt;er && *bufpt; = *last_e = && !bcmp(bufpt;,last_e = ,last_e )){er rrl = 0;er e = _root = last_root; */ * pofrt in rrpaosiperexp. tch eistPfr20fn_e = = 1 && ! Fvecmd)r{er *vafr20last_root)r{er Safefres(last_e = )f / last_e = = N SEf cmd_fres(last_root)f / } / last_root = N Smd;er last_e buf DJr- bufpt;f / last_e = = n Fve r(bufpt;, last_e );er rrl = yypaose();er rrl = |= error_rountf Ta"sfr20!rrl = ) / last_root = e = _rootf Ta"sfr20!last_root)r{er Safefres(last_e = )f / last_e = = N SEf Ta"stch }p. gister dosrrl = yypaose();erTa"stchTa"smyroot = e = _rootf */in cast cmd_g\ /does0anodher e = !aSUPPRETa"sfr20rrl = || error_rount)r{er n ack->ary_arrayf sp :tilast[0];er fr20gimmsr! G_ARRAY)er Ta"sst[++sp];e &mtr_unID f / fr20naosip