Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -235,7 +235,7 @@ public Method getMethod(String methodName, Class[] arguments, boolean nameCaseSe
outer: for (FunctionMember fm: methods) {
if (/* fm.isPublic() && */ (nameCaseSensitive ? methodName.equals(fm.getName()) : methodName.equalsIgnoreCase(fm.getName()))) {
Type[] args = ((FunctionMemberDynamic) fm).getArgumentTypes();
if (types.length == types.length) {
if (types.length == args.length) {
for (int i = 0; i < args.length; i++) {
if (!types[i].equals(args[i])) continue outer;
}
Expand Down Expand Up @@ -493,7 +493,15 @@ public MethodVisitor visitMethod(int access, String name, String descriptor, Str

Type tmpType = tmpClass != null ? Type.getType(tmpClass) : null;
Type rtnType = rtnClass != null ? Type.getType(rtnClass) : null;
if (Clazz.compareAccess(fmParent, fmCurrent) >= 0) fmCurrent.setDeclaringProviderClassWithSameAccess(tmpClass, tmpType, rtnClass, rtnType);
// LDEV-5862: For declaringProviderClassWithSameAccess, use the parent's WithSameAccess version
// to avoid propagating a class where the method has different (e.g., protected) access
if (Clazz.compareAccess(fmParent, fmCurrent) >= 0) {
Class sameAccessClass = fmParent.getDeclaringProviderClassWithSameAccess(true);
Class sameAccessRtnClass = (fmParent instanceof Method) ? fmParent.getDeclaringProviderRtnClassWithSameAccess(true) : null;
Type sameAccessType = sameAccessClass != null ? Type.getType(sameAccessClass) : null;
Type sameAccessRtnType = sameAccessRtnClass != null ? Type.getType(sameAccessRtnClass) : null;
fmCurrent.setDeclaringProviderClassWithSameAccess(sameAccessClass, sameAccessType, sameAccessRtnClass, sameAccessRtnType);
}
fmCurrent.setDeclaringProviderClass(tmpClass, tmpType, rtnClass, rtnType);
/*
* if (name.equals("nextElement")) { print.e(fm.getDeclaringProviderClassName());
Expand Down Expand Up @@ -640,7 +648,15 @@ public MethodVisitor visitMethod(int access, String name, String descriptor, Str
Type tmpType = tmpClass != null ? Type.getType(tmpClass) : null;
Type rtnType = rtnClass != null ? Type.getType(rtnClass) : null;

if (Clazz.compareAccess(fmParent, fmCurrent) >= 0) fmCurrent.setDeclaringProviderClassWithSameAccess(tmpClass, tmpType, rtnClass, rtnType);
// LDEV-5862: For declaringProviderClassWithSameAccess, use the parent's WithSameAccess version
// to avoid propagating a class where the method has different (e.g., protected) access
if (Clazz.compareAccess(fmParent, fmCurrent) >= 0) {
Class sameAccessClass = fmParent.getDeclaringProviderClassWithSameAccess(true);
Class sameAccessRtnClass = (fmParent instanceof Method) ? fmParent.getDeclaringProviderRtnClassWithSameAccess(true) : null;
Type sameAccessType = sameAccessClass != null ? Type.getType(sameAccessClass) : null;
Type sameAccessRtnType = sameAccessRtnClass != null ? Type.getType(sameAccessRtnClass) : null;
fmCurrent.setDeclaringProviderClassWithSameAccess(sameAccessClass, sameAccessType, sameAccessRtnClass, sameAccessRtnType);
}
fmCurrent.setDeclaringProviderClass(tmpClass, tmpType, rtnClass, rtnType);

/*
Expand Down
42 changes: 42 additions & 0 deletions test/tickets/LDEV5862.cfc
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
component extends="org.lucee.cfml.test.LuceeTestCase" {

function run( testResults, testBox ) {
describe( title='LDEV-5862 Bad access to protected data in invokevirtual', body=function() {

it( title='clone() on HashMap', body=function() {
var map = createObject( "java", "java.util.HashMap" ).init();
map.put( "key", "value" );
var cloned = map.clone();
expect( cloned.get( "key" ) ).toBe( "value" );
});

it( title='clone() on LinkedHashMap', body=function() {
var map = createObject( "java", "java.util.LinkedHashMap" ).init();
map.put( "key", "value" );
var cloned = map.clone();
expect( cloned.get( "key" ) ).toBe( "value" );
});

it( title='clone() on ArrayList', body=function() {
var list = createObject( "java", "java.util.ArrayList" ).init();
list.add( "item" );
var cloned = list.clone();
expect( cloned.get( 0 ) ).toBe( "item" );
});

it( title='clone() on SimpleDateFormat', body=function() {
var sdf = createObject( "java", "java.text.SimpleDateFormat" ).init( "yyyy-MM-dd" );
var cloned = sdf.clone();
expect( cloned.toPattern() ).toBe( "yyyy-MM-dd" );
});

it( title='clone() on Date', body=function() {
var d = createObject( "java", "java.util.Date" ).init();
var cloned = d.clone();
expect( cloned.getTime() ).toBe( d.getTime() );
});

});
}

}