From 2599b56f41927c9122e457bb811dc89a10164d2b Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Thu, 13 Mar 2008 16:43:54 +0000 Subject: [PATCH] natClassLoader.cc (_Jv_RegisterInitiatingLoader): Check loading constraints. * java/lang/natClassLoader.cc (_Jv_RegisterInitiatingLoader): Check loading constraints. (_Jv_CheckOrCreateLoadingConstraint): New function. * java/lang/ClassLoader.java (loadingConstraints): New field. * link.cc (_Jv_Linker::find_field): Use _Jv_CheckOrCreateLoadingConstraint. (_Jv_Linker::check_loading_constraints): New function. (_Jv_Linker::resolve_method_entry): Use check_loading_constraints. (_Jv_Linker::append_partial_itable): Likewise. (_Jv_Linker::layout_vtable_methods): Likewise. * include/jvm.h (_Jv_Linker::check_loading_constraints): Declare. (_Jv_CheckOrCreateLoadingConstraint): Declare. From-SVN: r133172 --- libjava/ChangeLog | 16 ++++ .../lang/ClassLoader$AnnotationsKey.class | Bin 1160 -> 1160 bytes .../classpath/lib/java/lang/ClassLoader.class | Bin 12507 -> 12663 bytes libjava/include/jvm.h | 6 +- libjava/java/lang/ClassLoader.h | 1 + libjava/java/lang/ClassLoader.java | 12 ++- libjava/java/lang/natClassLoader.cc | 59 +++++++++++++- libjava/link.cc | 73 ++++++++---------- 8 files changed, 123 insertions(+), 44 deletions(-) diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 84ea6c0b3be..bd92959477b 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,19 @@ +2008-03-13 Tom Tromey + + * java/lang/natClassLoader.cc (_Jv_RegisterInitiatingLoader): + Check loading constraints. + (_Jv_CheckOrCreateLoadingConstraint): New function. + * java/lang/ClassLoader.java (loadingConstraints): New field. + * link.cc (_Jv_Linker::find_field): Use + _Jv_CheckOrCreateLoadingConstraint. + (_Jv_Linker::check_loading_constraints): New function. + (_Jv_Linker::resolve_method_entry): Use + check_loading_constraints. + (_Jv_Linker::append_partial_itable): Likewise. + (_Jv_Linker::layout_vtable_methods): Likewise. + * include/jvm.h (_Jv_Linker::check_loading_constraints): Declare. + (_Jv_CheckOrCreateLoadingConstraint): Declare. + 2008-03-10 Jim Meyering Don't leak upon failed realloc. diff --git a/libjava/classpath/lib/java/lang/ClassLoader$AnnotationsKey.class b/libjava/classpath/lib/java/lang/ClassLoader$AnnotationsKey.class index 03de2da433497001e6c4ba1c6614d303d34d6d47..02b44fe24aec5140d6befa45950951e6af53e733 100644 GIT binary patch delta 87 zcmeC+?BLw+jEVI&13SZx$*-Bh6b~@4FdSvzWH`pa$8elMgy95(B*RGt1%^`$sz6$U r;q>Gr<|(4*8CV%EFbFVQWRPaK#GuA-nZbnN!enli0LB}WV_0+mJ|GwY delta 87 zcmeC+?BLw+jEVIk13SaI$*-Bh6t^+3FzjaFWZ1*N$FP?{gkc|pB*T6N1%?9*sz6$U r;o#&X<|(2_8CV&PF$gdmXOLz%!Jx))lEH-G*ko>&0LF8ZV_0+mAY2zs diff --git a/libjava/classpath/lib/java/lang/ClassLoader.class b/libjava/classpath/lib/java/lang/ClassLoader.class index ef012c299db1e647ee073dfda6ed4a6a1cab071b..694b514cc98be32d6bf989b6d8a22b36bff871cb 100644 GIT binary patch literal 12663 zcmcIq3w#`9wLfQPlFe?WZIUK!wggB^AL(w=0ELz&rKL?<8k(e~g@&|H*ls52(#>wz zMwbzX9-fRw-X)_r!z0(z%_7(V_Xg z0&DfJN+wg;Xf_V*n3_DQ#8SyvE-lhpp}KwR(h~a{r%uw%vdLVJ+zsYP`*x2$mVFch zGr>SKm&k5Pr?RjaP_9W0!3Io?)(aUE$l}?N*5VmpVuterkki zT~FQG?J=4`bLa%7+CekBWwJp-O$$8~dR}V}5Ys$^rjb!W3+xzKRN!sVP&5hGN(X5n zMf?K!955BtMz79<_?*wpY-pOcbQ0w9HSZO$c&Jq(N;2PbfDp$wd>e ze4Q7l?Pm+ORnX~>XnRW#AXgf61~uTl<;qY&T1{*G)Paa}aVv@qT1)Hj?m#Nt6CFY_ zINdA2R(qRA1FvDc45{&U5wzZ*PC5$=C(TPck#eF)5U~0L^V-P$)HT6fI+Iy5os1^d zrqii(1@$0G&P_&lCd|fcsxg)}qgk`Dh{7OkpiQFf*+t~o*cWb<8CwiGht5UX6FNGg zxeO3Bdo?|0S2}g6NNV>g<&OHPm#JQnSMWS!m40(eDwmGI_qS4?fIzZ3*n&Ra3KVQYu@;y^qGh1vz-`Lx4N7l5US5;mn0@z{t#7t%$*E*`4}fTX~tv#j+5 z1~{K~8Wba>&Z+W(nI4K~GFEmx!-nR(UzS`;}#mT&3gJ#f7nU^+b7A0jY zYfy-0`e_e#4A=G7UKTTlC7~i9y0Ag@2t*X*e|vvXmI9ZMMdh(T3U?Wd1Iu&b&k?2C53AYD%%7kl4;P%bSA4t^8e;-{OD zXw{O+Z11-}8}teKB(@i*RFs?xInP6?lT1DZBbU_bdisn(x6x;@VoxVh&K&Qos8c|+ zx_deT=~lYkpgSa!mBkXNBs@dU?ux@^Q?1fNN-EhOk?Dp^@t+H`Bg2@*olJ&35>NJ< zaDj^5xVbQGUV@CAHZ!OPV6Nd@X>%XCv(<2BT*Dvf6 zElB%lr8wlH29;5{+~p1OTX$myHqCNTcBRDoxIuOFgeph2$;7AR_tYRArf>S`8xyxx zRe2cnG<^%f4F4)%x3_PmV++Z}Dh4L*?(mCNI%3dK*rqEP`dj_E#kXqdKnt5Jc3cHoZGHM!9?)R|^x>T#to>X>SDwphc_(tXXx2(22 zyaEa^y=2h$=!Zp-RoLvku3%w+=OaBRemqBnIe?35ztpA7nE`WMiY$?eRjV+TlXLay@AV#^Ra{F_1lF8h9svO}R7 zj>XJOMpk>(pr6w(5ON7KIhft0+(U`^l|ir3ukj$ZE1F(~7!d#+LdUA8>%_S0%q?H*vR@WWw(Z`n^mD$OOfcjJ{>iALx%r00{F`VvngFNcH2%& zXTLoQcS6XT6tHkCNH5SPaAX~x>=kA7i&=RZ)oBHRf>I zlu`pV!K~8D*p9)PLGQ9&+N!1HgS`G|HVXgVz8Z|C1_m;cvo&yDRASkNE4fTTex=Aa zm^!_Dd0w4Xr+Zq3Z*YxhFrDcluT*6! zL8|{fU1J$ z;_QYPurtcUx8N+=&KwewU9wGjI=Q|PC{n;5Pj4YrO{^SI4cOIVt;guf7vwcNw|I`i z01QKJQXP^YFX9vZ+=_j6;(2y!H@X0^-M!JoZZmE0NphsF!)qPU1Wx5vNn*Jg@)0jK z_!Pz&(}-tQ;T)F9rqYse-+NEq=I5mo_V&%WWHvrzxFgFv*V@UN%nD1a==*zpULZm{I4L+Z-F;DSooC)%IyaPoc zU&wTljcSr67Acd4#Y3i9y~6^7pvZ0_PMQq|D!tBR4Y{8O{0!TwwvnsX+M(g>h(|4h z2N@-V_=DTjn1fPrA|1uAAzE&vkq?lCwn z4n4)HQ0&5s>8=v4X4%2pSNnU96x`QaG};iQ_~pwDzJfmhLZG7qeL}*S7}*MYVF5pX z5NW_Iw>r@q8H^@Yr3Vp=$*dE1e!hA_XUkf0buOMjKfi)Mj5DFVWMh!8Lhj_N_&S3> z!q;P;jt;|ADArm^@affR!lLaJ{4vxdjnM>5+&|K2*`{9>zQN!drA(;ErmRNKjSR! z&!$$T(@}J?n@VnMB{nS5ydN}0Wvy6h80$^gU+sOj(?dyN zs8cd@#jx|Cr`9X7zy<0CD~G$RRibS1{8Fc__|9}R4cQ@-1Z%ACCzC!x=uO+y3CdLc zVFZgzwilW-c}598#_KqqGg<}p(lp%1hsEj9EU2+3E2gElh{}PV=5PD?TNC1Cbt;uG zqe+90@KIPmSyF1N89?SC$ez|-$={)S{QNA^rn}2vd87#-R}Ni-Ti|_9I+=jCl+j+p z_ZSlg*5a>0XiX2&{c_3-S{>|l zaS5F&Ph2e$l-No-lPJm5xcKQ*w?&r0XD@v=&b%5vU`|2P5M3JFRY{KqqZPRKQ2@Wu zslk1XG(^-D?GRk+<%5p;jdr6mzXs!I_F|l*g@b?VrKzia!%pfq8oKH?h{1IpBppKy zSm9VAUPL;i5`A=xjypheYvzwp(}wU7+O(e*9i_9vHK*ih$sJ^bYnJ2YcB&eu*1l0% zaex->rAS!YPjkm;RaYcWXC9_jHCop-P8<4ax<_dvhBqIk4Tr{QYajC{ows3(wukc+ z#T2tI92up-19b5iB@R$(j4nAqnMZ)@R9cTu5INww6v#F!?H&Yc4^TOmlfizP!2xRG zN_-5erWIU68@Lui(tiSFwabQ#t? z1^gRyHjU8b__YESxq?0b>0My=O8Ow~1|j(>x*AVYnE4_4FvhCr8oCx&aEF3dEJt)= z_))rUoUZSSG#p!}kJ88TbmL*VwXG~vwx2$I4^@ZCj*t;5%hTsDypQ+c9ZR<`Y)$kk zEb?<${ulW5OIZC^kn$?5_%qn@HQ4Ldw1{3;m{(Zx=<~`GAep|PFw5N+=}XFzC(@U3 zCq8x}-HAILtJKq7^eO0DMPH$>+UOs!(JwAWA1XUa0RZ1iP#{lt_sW2u_fn;!f}_A3 z<+g7^$XmGk0~Giph*Xu1AMU!oMED9i8JZ2TRc|qC4M=vUl+VMmJ+#il;dHR9tdy;dAuTer~SW_G!etH>E z!R(Xn9_G1A&y_}K31P2@Fm8vMWe|2HvPVzL5o(B3Ey~l6m*{o6@5?l`C8E{odHQLd z{uPTzQKS{gzFuu@zi-!3qW%(Jp9NUwmk@W~8 zDC|&orA3_@dmFa*fszqrDGj!-ra!5WTm}l?LFnq#fe+T!oi6>+64Y9DJl(cqV4Pm) z16O}O1QC{6mL=czSTf+i3D|II>0SD7h$~p~FA_KSPwhHv<+HP4I~`+zFe8)Y*;nK& zzDgw`Y)x`Sa2e9FtQSCPwvteQD^wDKSk^r{{lyj-P`-Hq(wVqRWjNA|%*lBU7K@y# zL`ts4G)H8mLvp1OE)HI)gi9z_D&aaZJbI%ggilezABJ!-T}ybBr%H;e*iRR?m03_i zWn*03Rt`ry5Gv1et^8Bp8!C6aF90eJf06{BXn^El?E%;D)c&jp?{BO zmLn}tSbE_NGCLsDM#i{F(xIkyb4zd*wB;atj}mNUAFt0!Krk=FTUO!@&^sK)qO}}( zpAcCK86tLy5^I+xuEo@z;JX&0uk(nV;^;fY*0-9Q=>!OqE&fXQy0}yXX}&9Rgl3O% zi=_Kdb2!f@-$B)pabD6lolhI(wmi2>VsZt}f=S5t83?=$x_*uf-|bZIyMyNYzMueD zsXbx?&}o566DT3EL0o}kvy+EOsideErRoq{+Ng0Do1ja zO)yKh&nEb4TbsE;-BGH9w{&*zMZGC0KF=Gvn^BA)$#YkCvn$DB_IdLAUV!_)2v%RB z2Hy{9j_+k9*-BA!9m#WT$&wB3;*F454}PsXmUbP+?aauVZC5@=v3(mtP}rXD;yc%a zueW=g&+BUzfZIm-0zqi`d5t7V-*18N4IunI5WeX_Hs3)u-$lk3aa19jYTYTjNNfN# zM#S#*_%LeS>C!NKPt>Q`0jQ60%wbSql1w|K?25-T$AMhRwx z^d2A*i`I(Klz)}+K7`TGzFz1l9v-A>c!Bz}4qUB0R(YJ(L*?2=3Tm6k(9Wi6Z41?C z=PG$tEY~_*)Y@E>V>ikuj|*|u!LZwAc6xY>b6t_61PDOmLclQ)qAO7`%GC>@pUO0o z0@?soYJ*gz#Q|ft#~jm@V1nCPg3+CjKO?l2zXWb6DlSAmlVe^Z@|ond`UvcUlS+6( zI>VUDuEoHOq-!@(g?0-V_yo<=K1uVmPdnmul(kZnO5P5s9EKhaU&@zR;<1rc;(wwY z!u`k*nlsK<_KovZ$e}5pNBO2h<9u^pq`4)ehsr|bA%Ca>x#tsY z0mR~HUt92-a*c!nYHJQYy_fu<;M0df0kPsb{QX)lB=yoZb+ss5B+|7p;D3x}X^+zh zxGvDf=|t@bT88Ti?MYgv9ip>w-L8E@=`{d<0Ak0oJ8a8hj6Vf`6*_nDr*S7lxNp+lfM&m=CEA-X@E_<5?T@q? z*E6-ZX@mAB>c(}G_70t^{h4}k-KM>(7_bi8=i3a_&~!e)k3!2PI>o+Q3@#30%m*_b zXWyMkb*N(>g)`_lLA2Ngea}>?S2@8WIus7}g;dHshVzG&xK`k~I9qx67@RxZ6QnBr%zL;uotamj@|zs_O^*B~NB#?i-WNJc8t6b#8`eOm zbIOPQg*E^`=jv|BJP$PYQI)=pj?uR(ovppAP&QY|=VP1X3v7ec?WJkq$h~;;!3f+N z`TnoJ*B*3y)*`i^G<^W14pLCxMbq?tnyz2$v1gs5R2_dG=@k_=x8O< z%mfygVZBf)4=+{460uAy5|3SH4l;2+)AaOcI%5vIU_s!Z8I5DD!L^A*G84(fk_jx| z?1B+ZCZgGtNNekKZVTA_+haqCNG6*ynWBH=YpcqGp69}_*&OZI?V4s0*0BbP%>Wyb zY&^3imCS%dAYPvwj>Hm7P1Xx(6M$ox(YDeVc)7uTd2KpvrsUo2P&x~h8!d8diYGmu z=2FcvO2dd{jY(5yxoDpBunuge)02jMtD~R^;peCBbR5xU1wof*0uz8V-Lf2~@equV`AcOoqnr}Pp;yiDQha(BNSt>vaX_1$j zna&+bWZM+-kx1r1n?C1=wo$yEJec#?6o#?+`&74Z4&zf#HOCZC4_li6o*}x30*%HgYdrR^%>SiHw;_ zMB*D#sbtDW-H4Ja5|Mpzvni8oil)p+#%wB~FhE_@E81ROLQdX_J7vaJgSOFjCcn_p z8Of%BsKu@6jsvOWwIZp=?1fP;UBNU{k(c*8WSBv7dor7f!uNO3E&=gIrlt0>2{Y4n z#kTHzVsPGy!VTLx#TWO-qEM(~5fJv%9xv?%OT`klB;&E@s6l&a0NBN2)c}y>*>sk* zp1=V8bd^C7+Q&3iUNBR`v2@zXl$Y4hoRhKb>^SLD$OEO!4 zqO@PQ7-CxcIsz@9dVP6|c1rBW44O_gl3xxQ)If0*hrIf#_DG78c?pB+s9xrc7&MdO zGL|xE2Gx5B)u*=L`WxO9HAf_&A|Sd^ta`J<`^?l1u|HEycQP7@?~J5k^4lJ)1W;re zd0JS;b}=STR6x0&SkZt=_9l3xYupixc=bdP&$CKsa9IR-6)9_&XgrllreXc*;1T{jjf=oATivL`h86Cka?qV|Rkyv8T zgbVl%;^xYfc?~jh%1omlfVoDp<;}IKEQxN!c@D~q3DXZ6^htUMxy^r$$+5xBS;fXk0m;?rogmmWv(6#T+& z*8+5uR*OR(H>iRt7s{-^{I_0I$6&F+0Zy0o% zo<<16tMZ8LqRn(pKBZVKKyginH?-0h40=XtYD4sZ89msks*y__LGVR`eB_tAvj(bq z6@omC0QO7cZ2QW5HyimH<+6vGhD7@%)V>12YP2_**_g~G1|62s`~EGftqQGy0!%L% z^gMmFB%bmm-t7Pu2KakIwFK1;{EeyPFj{D)qLlKQOIU(0pnovvAL*aqPiQAIT@n(P z@5k!RU5mP;_4$@T-=^HaxfvPCMT;#%?C?EtbG|F5<3Agc^EB>bzD+jSN8tMCn;DjG~q8nMyfPs>9_7 z|0l)JVDof?Yq%EPgFI$6?ZwTt6DvpQK^SMy-f*JwWDZ5*O#N<<_GAlRB9?4hH<~fm zW%utl^PvBCyzl+HEv^i~v$)aAv-90tF<^twk;wO_Oxa?iJ_j)UJoFOWgdH1Vz|JVe zZ^2o#eOV+VyHT6;baGcCP^4`?hklDxRopM42e5m_I+xLvFUV_lZgFjZ0T_ndqRvPH z9O4!)V}Clkco(~~2YdhM!CjH~K{I7=t8Ap}@mgmjj=i|mh*++Me8g=AFJWv#jaYgu zc3g+o773lAS$= zl-1JUbsmC2q$%VLIg~L|=r9(#eaA|4Wm+70Ei`GSa9eh=M9jqockm@rRmx65D5Wh7 z(saBBNf^v-Ln@cO9lAxgFgsrIo@8(GBnNCXxRcil{Tt=KE`u*)Y^@Ec6otj6+L30z zi03X@;2`|k!c^D1A(0(6Q|j!i!^&+XMXOj$ zN9k*b^67ZR3i3R1yYW<=XnqXZ)Vl1yHVyYOBWM}RHCVRKiK!E4?X9UD0lu2!UOos< zQhL~SG?(1$EZHUtR@*#t-mECv%Iy%sc5>9bsEA06NynG$fK%w30!imUGB)&E^ zgkVf$oVfGyn~Tn~tR>fFV{sg-`}i%`3EE3G1^9a8PQISsZt#tK6Y6wi1g3(swU*)2 ztyR&Y9X`GpJxNm}4igWKHd(eAl!b3G_*Q8Xe3_*6N`ObH*UPu(cUx{11AH65N22r& zriaS__XPg#J*s&4(<5edM=T?!HUYWc2?CQT#H;lqCFfo!ud(5gcz&AP zJJYNm_B0&vMB?i6!w90%B{uH`k{1tI$-o{$_%<{b9i$ZI9_5c3{4wcA^fW$eptA6N z2H(#Qz|?5NvhrobImT1D%yrOK#SijBUjAhMM6l$!!4LCcRIN;MZ7LPP`E_&I!d9l( zi4LDK_#VDjg5p!yEb|eAALFB-DI#k{lOtHKsJ`0g0bMRi@}2&V66&mi|d!#ZN>JbA}PoYq9s^weKnc%=|OMq7l~d|oeCpZWU{@`q{$6s{1~re zd(Jp2Xpp1Aqx@NMdK?zi*pn60a-xX-j!*OFz5H}hysS$m<7Omb@E7&Ph-IPW1>wHgZipp1G#k77oVJ_}Hb-!DdmzcSM7#?aGfciZPafZD&nnaxc6Z8 zOgYlUJ;{*`{+}sFx9T_SqJHDpR{aJMxX#DAL7IgXW)tyZ(ye^qg67uD8>a=E zLuY8qacVhBmxXGU=4ko7WQ1zkadQtz-S z@1CHpzM9Qr)PvzIPgB?F3EI)eJVrY=k5gYLM^|D>v@aAMBl83u7^kaG(C|1VPtY|_ z0M`Yyi8fOjxUxXD4f+s$0xUfMUj7Fx{23niD!xx)CVSy?KHAIyeBzjbFAGzt51Y%q zJR67Rjg-VT=6baFZ{ZetJFlU4@M^k+uA@U(aXI)lXe(VyZ^ExNII11R6Kr?E=k@ev z+zmnU4fGZ~O=9L->1`ORrnl3LxPm)6W?O1W=t;V1f^O~$H=a|kkI^kTy6tJYtGyyv zah%@w5KRwOoFOAvk)yjYe2kCbT}!tRjbo>@<`2*PN zhqM?6F@kxG@{A>PkMab<_py5wX1V(aeN3* z%QT06;{v|S0lv%uzRUr>%mKd422Qk$9#+70s6Gqo9fmX=3Ou3=umU6a=tsT~+;EIO z{e*)nAXM;Hz}}|h8`eBqzN~h{rr|MAC1iDm#^|xo1RaHUA3I4;6mC!8_I8Y(JV`f& z#wmA_o*Ji#o|ZG@ZOPH+L*bM3Y)C&zXA0t%!e5B@0qTv2(^~=kQ2;)IZ?5yHg-u$* z`)N53(M5cKR&$Kj@zn}ulLf`0sS~8i8R!zk_H*cu(w<_f)D_uNNQTfDjYX6K))*U&_!KM2>z;M#GJw%`Tbzt9HE+?jH(b?cd-rl-Y!@dIxak zH-Lzhs})j+KZoyKr|3F9t*G0Cn1R9$bvIblsj+`Yk?nUkrcc}`6TaYF>$CafbXDN}Am@&-}S>=#irG$%vS1I8Vw^d5Gj&zQL z&oaXOO8DatE~aY@jd4KoneR9qXs@uK1S`gQN_!<7?TKJzj;rOrx?MpRJeB4=D@pgX zli$-pQ$4F`x@QeF;5yrLF@-#rxcsBlf!^vsZ*`!zI?!8f=zzubsNup>4L873Dp7g< z$TP~QGgGN^$mX)KCC9AgFAhUSd(B1!YXmQaot-%HcO6TGyqmY0w5iX2}kiK!rP z7ED5(+ad7X(De>7Ja^Je&t0^@^F9T@O6_4AfR4Yhk%W%^5XE5>N!|l}J9w2tE*uL` z_Tjfc3MegM?KP$B-Uo^I!zmwdNeMV=22{F{a1HQUR8o(NXFO9pFP9HBdAVdIpiTHK z>{g3h35;-#*F8;_6!f(SJ_6~Fy9lm!Bv;!6vmE8w1iuYyiZ=6vy0cUTZ`sgu7|o@m z_#9u_gO<~eB+r|AS_+aZW}hXm=ZkRPvtadkYV^E7b3HFA$ySP*=SZGsOEw_uKHdzO z(mGprEN5{Tw=*O6+OE7sv3)l}Q1C4%;M?lLx4mbAcl5Ogz@1~@ET|+K(gEQkGHE2K8V?urlZk`jC6x-R?&$p6F{2d_k_^pkI~dz%z%*8w@;iI_MWG zZj?V7gQQ*flP$Sg6fPF&+EL(toMvgq=zLrkYERG-6pNL(uF+1=M(reR#dWtfru5pc zHe>^iWe04_LJPhV{wj11@LjkQuNvU@;!e7#0e&Cuq;DDE_v21B@B{n-+)39lz#oKH z_^|6};=9p~`oR;9P;DQ546Di-D+^iY!>+88m8^KKVxiX}K~gc_*3$|SDqEj9ja2EO z^I?ePSY$b^P*;lr)wgKasAy+tn)W=+)Lx`U?aQFzC2GUXaef3E zR>`j%f4ZmTRQS|Yc&WEVYt>p#jq{^ntyKnb*DBh1X)c^i&Mp?JtEJsWbl9Z*0NVWs zq4{HK!hN&$Q)u=xTA{rR1OJjP(SAkiaJ^J}g*I!yrXF0kXuqK=wBOP$T>G`(DF&>a z^&Xpn8mi^Tksxp!h<%!Mw+vi7p_0ZL{AsRrcPZ8Lag1p&=m`qj27S#`s#iL}BTky% z#phEg^OJniUSkcOi?daRW@Eo8Mc>j{m0i7_D)a`|T9wXPmDssdVU0OF#^d%{*TP2P zuJc1r@>6Fe?y<`~PQzn7agv{sL2SAB)KmPdM!O24R1VM=l2>mgpT3A{aIM!vG*1sJ z(N-3m?}(o7#L9dH!UGUz9S|uSL^I?)R{(L10`Z&-A|bp`4u`6)`YPa94fz+-LfvY% zE&0uk{ANdfvm^h-{6QCvku=bOrZ$9-f6Ce2L;w7qpPwt}ZprKg&6iWPj_yF;s&uw$ zSH5komT$v0$x_Y5VD*P-S}6Q5-aHb9dn4b!`g`q&V?T@3e$wj#BmfC3OPekw2NRMM>)`s?;KW&fH5=C+HF6)Gv?mOQ#DOsNP#Y2-f1T+^`FM at-ZL1zbdf!Yy5RwafppSKV<#}&HO7r73By3 diff --git a/libjava/include/jvm.h b/libjava/include/jvm.h index 84847548f01..64cd6b5d7f9 100644 --- a/libjava/include/jvm.h +++ b/libjava/include/jvm.h @@ -1,6 +1,6 @@ // jvm.h - Header file for private implementation information. -*- c++ -*- -/* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation +/* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation This file is part of libgcj. @@ -265,6 +265,7 @@ private: jclass, jclass *); static _Jv_Field *find_field(jclass, jclass, jclass *, _Jv_Utf8Const *, _Jv_Utf8Const *); + static void check_loading_constraints (_Jv_Method *, jclass, jclass); static void prepare_constant_time_tables(jclass); static jshort get_interfaces(jclass, _Jv_ifaces *); static void link_symbol_table(jclass); @@ -557,6 +558,9 @@ extern void _Jv_CallAnyMethodA (jobject obj, jboolean is_jni_call = true, jclass iface = NULL); +extern void _Jv_CheckOrCreateLoadingConstraint (jclass, + java::lang::ClassLoader *); + extern jobject _Jv_NewMultiArray (jclass, jint ndims, jint* dims) __attribute__((__malloc__)); diff --git a/libjava/java/lang/ClassLoader.h b/libjava/java/lang/ClassLoader.h index ed6f5449adc..5112eab983e 100644 --- a/libjava/java/lang/ClassLoader.h +++ b/libjava/java/lang/ClassLoader.h @@ -86,6 +86,7 @@ private: void checkInitialized(); public: // actually package-private ::java::util::HashMap * __attribute__((aligned(__alignof__( ::java::lang::Object)))) loadedClasses; + ::java::util::HashMap * loadingConstraints; ::java::util::HashMap * definedPackages; private: ::java::lang::ClassLoader * parent; diff --git a/libjava/java/lang/ClassLoader.java b/libjava/java/lang/ClassLoader.java index 4682dbbf010..e0463ac2af6 100644 --- a/libjava/java/lang/ClassLoader.java +++ b/libjava/java/lang/ClassLoader.java @@ -1,5 +1,5 @@ /* ClassLoader.java -- responsible for loading classes into the VM - Copyright (C) 1998, 1999, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. + Copyright (C) 1998, 1999, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -45,6 +45,7 @@ import gnu.java.util.EmptyEnumeration; import java.io.IOException; import java.io.InputStream; +import java.lang.ref.WeakReference; import java.net.URL; import java.nio.ByteBuffer; import java.security.CodeSource; @@ -129,6 +130,15 @@ public abstract class ClassLoader */ final HashMap loadedClasses = new HashMap(); + /** + * Loading constraints registered with this classloader. This maps + * a class name to a weak reference to a class. When the reference + * is non-null, it means that a reference to the name must resolve + * to the indicated class. + */ + final HashMap> loadingConstraints + = new HashMap>(); + /** * All packages defined by this classloader. It is not private in order to * allow native code (and trusted subclasses) access to this field. diff --git a/libjava/java/lang/natClassLoader.cc b/libjava/java/lang/natClassLoader.cc index 9a687ff9105..fac1e4dede0 100644 --- a/libjava/java/lang/natClassLoader.cc +++ b/libjava/java/lang/natClassLoader.cc @@ -1,6 +1,6 @@ // natClassLoader.cc - Implementation of java.lang.ClassLoader native methods. -/* Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation +/* Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2008 Free Software Foundation This file is part of libgcj. @@ -41,6 +41,7 @@ details. */ #include #include #include +#include #include #include #include @@ -143,7 +144,21 @@ _Jv_RegisterInitiatingLoader (jclass klass, java::lang::ClassLoader *loader) // them later. return; } - loader->loadedClasses->put(klass->name->toString(), klass); + + JvSynchronize sync (loader->loadingConstraints); + + using namespace java::lang::ref; + + jstring name = klass->getName(); + WeakReference *ref = (WeakReference *) loader->loadingConstraints->get (name); + if (ref) + { + jclass constraint = (jclass) ref->get(); + if (constraint && constraint != klass) + throw new java::lang::LinkageError(JvNewStringLatin1("loading constraint violated")); + } + loader->loadingConstraints->put(name, new WeakReference(klass)); + loader->loadedClasses->put(name, klass); } // If we found an error while defining an interpreted class, we must @@ -156,6 +171,46 @@ _Jv_UnregisterInitiatingLoader (jclass klass, java::lang::ClassLoader *loader) loader->loadedClasses->remove(klass->name->toString()); } +// Check a loading constraint. In particular check that, if there is +// a constraint for the name of KLASS in LOADER, that it maps to +// KLASS. If there is no such constraint, make a new one. If the +// constraint is violated, throw an exception. Do nothing for +// primitive types. +void +_Jv_CheckOrCreateLoadingConstraint (jclass klass, + java::lang::ClassLoader *loader) +{ + // Strip arrays. + while (klass->isArray()) + klass = klass->getComponentType(); + // Ignore primitive types. + if (klass->isPrimitive()) + return; + + if (! loader) + loader = java::lang::VMClassLoader::bootLoader; + jstring name = klass->getName(); + + JvSynchronize sync (loader->loadingConstraints); + + using namespace java::lang::ref; + + WeakReference *ref = (WeakReference *) loader->loadingConstraints->get (name); + if (ref) + { + jclass constraint = (jclass) ref->get(); + if (constraint) + { + if (klass != constraint) + throw new java::lang::LinkageError(JvNewStringLatin1("loading constraint violated")); + // Otherwise, all is ok. + return; + } + } + // No constraint (or old constraint GC'd). Make a new one. + loader->loadingConstraints->put(name, new WeakReference(klass)); +} + // Class registration. // diff --git a/libjava/link.cc b/libjava/link.cc index d6fd2ddafbd..f995531e813 100644 --- a/libjava/link.cc +++ b/libjava/link.cc @@ -246,13 +246,9 @@ _Jv_Linker::find_field (jclass klass, jclass owner, if (_Jv_CheckAccess (klass, *found_class, the_field->flags)) { // Note that the field returned by find_field_helper is always - // resolved. There's no point checking class loaders here, - // since we already did the work to look up all the types. - // FIXME: being lazy here would be nice. - if (the_field->type != field_type) - throw new java::lang::LinkageError - (JvNewStringLatin1 - ("field type mismatch with different loaders")); + // resolved. However, we still use the constraint mechanism + // because this may affect other lookups. + _Jv_CheckOrCreateLoadingConstraint (klass, (*found_class)->loader); } else { @@ -269,6 +265,23 @@ _Jv_Linker::find_field (jclass klass, jclass owner, return the_field; } +// Check loading constraints for method. +void +_Jv_Linker::check_loading_constraints (_Jv_Method *method, jclass self_class, + jclass other_class) +{ + JArray *klass_args; + jclass klass_return; + + _Jv_GetTypesFromSignature (method, self_class, &klass_args, &klass_return); + jclass *klass_arg = elements (klass_args); + java::lang::ClassLoader *found_loader = other_class->loader; + + _Jv_CheckOrCreateLoadingConstraint (klass_return, found_loader); + for (int i = 0; i < klass_args->length; i++) + _Jv_CheckOrCreateLoadingConstraint (*(klass_arg++), found_loader); +} + _Jv_Method * _Jv_Linker::resolve_method_entry (jclass klass, jclass &found_class, int class_index, int name_and_type_index, @@ -359,39 +372,10 @@ _Jv_Linker::resolve_method_entry (jclass klass, jclass &found_class, throw new java::lang::NoSuchMethodError (sb->toString()); } - // if (found_class->loader != klass->loader), then we - // must actually check that the types of arguments - // correspond. That is, for each argument type, and - // the return type, doing _Jv_FindClassFromSignature - // with either loader should produce the same result, - // i.e., exactly the same jclass object. JVMS 5.4.3.3 + // if (found_class->loader != klass->loader), then we must actually + // check that the types of arguments correspond. JVMS 5.4.3.3. if (found_class->loader != klass->loader) - { - JArray *found_args, *klass_args; - jclass found_return, klass_return; - - _Jv_GetTypesFromSignature (the_method, - found_class, - &found_args, - &found_return); - _Jv_GetTypesFromSignature (the_method, - klass, - &klass_args, - &klass_return); - - jclass *found_arg = elements (found_args); - jclass *klass_arg = elements (klass_args); - - for (int i = 0; i < found_args->length; i++) - { - if (*(found_arg++) != *(klass_arg++)) - throw new java::lang::LinkageError (JvNewStringLatin1 - ("argument type mismatch with different loaders")); - } - if (found_return != klass_return) - throw new java::lang::LinkageError (JvNewStringLatin1 - ("return type mismatch with different loaders")); - } + check_loading_constraints (the_method, klass, found_class); return the_method; } @@ -925,7 +909,8 @@ _Jv_Linker::append_partial_itable (jclass klass, jclass iface, continue; meth = NULL; - for (jclass cl = klass; cl; cl = cl->getSuperclass()) + jclass cl; + for (cl = klass; cl; cl = cl->getSuperclass()) { meth = _Jv_GetMethodLocal (cl, iface->methods[j].name, iface->methods[j].signature); @@ -947,6 +932,9 @@ _Jv_Linker::append_partial_itable (jclass klass, jclass iface, itable[pos] = (void *) &_Jv_ThrowAbstractMethodError; else itable[pos] = meth->ncode; + + if (cl->loader != iface->loader) + check_loading_constraints (meth, cl, iface); } else { @@ -1501,6 +1489,11 @@ _Jv_Linker::layout_vtable_methods (jclass klass) sb->append(_Jv_GetMethodString(declarer, super_meth)); throw new VerifyError(sb->toString()); } + else if (declarer->loader != klass->loader) + { + // JVMS 5.4.2. + check_loading_constraints (meth, klass, declarer); + } } } -- 2.30.2