Skip to content

FieldValueResolver leads to IllegalAccessException in 4.3.0 #940

Description

@mdesharnais

Hi,

the following code, wich uses the FieldValueResolver, leads to an InaccessibleObjectException.

import com.github.jknack.handlebars.Context;
import com.github.jknack.handlebars.Handlebars;
import com.github.jknack.handlebars.context.FieldValueResolver;
import com.github.jknack.handlebars.io.FileTemplateLoader;

public final class Main {
  public static void main(final String[] args) throws Throwable {
    final var loader = new FileTemplateLoader(".", ".hbs");
    final var handlebars = new Handlebars(loader);

    final String str = handlebars.compile("foo").apply(
      Context.newBuilder(null).resolver(FieldValueResolver.INSTANCE).build());

    System.out.println(str);
  }
}

Assuming that this code is in the file Main.java and that, sitting next to it, the file foo.hbs contains the following.

AAA{{> bar}}CCC

And that the file bar.hbs contains the following.

BBB

Then the following command produces the exception.

$ java -version
openjdk version "17.0.1" 2021-10-19
OpenJDK Runtime Environment (build 17.0.1+12-Debian-1deb11u2)
OpenJDK 64-Bit Server VM (build 17.0.1+12-Debian-1deb11u2, mixed mode, sharing)
$ java -cp "./handlebars-4.3.0.jar:./slf4j-api-1.7.32.jar" Main.java                                   
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".                                                                                              
SLF4J: Defaulting to no-operation (NOP) logger implementation                                                                                                 
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.                                                                            
Exception in thread "main" com.github.jknack.handlebars.HandlebarsException: ./foo.hbs:1:7: java.lang.IllegalStateException: Shouldn't be illegal to access field 'size'                                                                                                                                                    
    ./foo.hbs:1:7                                                                                                                                             
        at com.github.jknack.handlebars.context.FieldValueResolver.invokeMember(FieldValueResolver.java:217)                                                  
        at com.github.jknack.handlebars.context.FieldValueResolver.invokeMember(FieldValueResolver.java:39)                                                   
        at com.github.jknack.handlebars.context.MemberValueResolver.resolve(MemberValueResolver.java:59)                                                      
        at com.github.jknack.handlebars.Context$CompositeValueResolver.resolve(Context.java:200)                                                              
        at com.github.jknack.handlebars.internal.path.PropertyPath.eval(PropertyPath.java:52)                                                                 
        at com.github.jknack.handlebars.Context$PathExpressionChain.next(Context.java:361)                                                                    
        at com.github.jknack.handlebars.Context$PathExpressionChain.eval(Context.java:381)                                                                    
        at com.github.jknack.handlebars.Context.get(Context.java:621)                                                                                         
        at com.github.jknack.handlebars.internal.Partial.override(Partial.java:253)                                                                           
        at com.github.jknack.handlebars.internal.Partial.merge(Partial.java:226)                                                                              
        at com.github.jknack.handlebars.internal.BaseTemplate.apply(BaseTemplate.java:126)                                                                    
        at com.github.jknack.handlebars.internal.TemplateList.merge(TemplateList.java:95)                                                                     
        at com.github.jknack.handlebars.internal.BaseTemplate.apply(BaseTemplate.java:126)                                                                    
        at com.github.jknack.handlebars.internal.BaseTemplate.apply(BaseTemplate.java:114)                                                                    
        at com.github.jknack.handlebars.internal.ForwardingTemplate.apply(ForwardingTemplate.java:100)                                                        
        at Main.main(Main.java:11)
Caused by: java.lang.IllegalStateException: Shouldn't be illegal to access field 'size'                                                                       
        at com.github.jknack.handlebars.context.FieldValueResolver.invokeMember(FieldValueResolver.java:217)                                                  
        at com.github.jknack.handlebars.context.FieldValueResolver.invokeMember(FieldValueResolver.java:39)                                                   
        at com.github.jknack.handlebars.context.MemberValueResolver.resolve(MemberValueResolver.java:59)                                                      
        at com.github.jknack.handlebars.Context$CompositeValueResolver.resolve(Context.java:200)                                                              
        at com.github.jknack.handlebars.internal.path.PropertyPath.eval(PropertyPath.java:52)                                                                 
        at com.github.jknack.handlebars.Context$PathExpressionChain.next(Context.java:361)                                                                    
        at com.github.jknack.handlebars.Context$PathExpressionChain.eval(Context.java:381)                                                                    
        at com.github.jknack.handlebars.Context.get(Context.java:621)          
        at com.github.jknack.handlebars.internal.Partial.override(Partial.java:253)                                                                           
        at com.github.jknack.handlebars.internal.Partial.merge(Partial.java:226)                                                                              
        at com.github.jknack.handlebars.internal.BaseTemplate.apply(BaseTemplate.java:126)                                                                    
        at com.github.jknack.handlebars.internal.TemplateList.merge(TemplateList.java:95)                                  
        at com.github.jknack.handlebars.internal.BaseTemplate.apply(BaseTemplate.java:126)
        at com.github.jknack.handlebars.internal.BaseTemplate.apply(BaseTemplate.java:114)
        at com.github.jknack.handlebars.internal.ForwardingTemplate.apply(ForwardingTemplate.java:100)
        at Main.main(Main.java:11)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:568)
        at jdk.compiler/com.sun.tools.javac.launcher.Main.execute(Main.java:419)
        at jdk.compiler/com.sun.tools.javac.launcher.Main.run(Main.java:192)
        at jdk.compiler/com.sun.tools.javac.launcher.Main.main(Main.java:132)
Caused by: java.lang.IllegalAccessException: class com.github.jknack.handlebars.context.FieldValueResolver$FieldMembercannot access a member of class java.util.HashMap (in module java.base) with modifiers "transient"
        at java.base/jdk.internal.reflect.Reflection.newIllegalAccessException(Reflection.java:392)
        at java.base/java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:674)
        at java.base/java.lang.reflect.Field.checkAccess(Field.java:1102)
        at java.base/java.lang.reflect.Field.get(Field.java:423)
        at com.github.jknack.handlebars.context.FieldValueResolver$FieldMember.get(FieldValueResolver.java:135)
        at com.github.jknack.handlebars.context.FieldValueResolver.invokeMember(FieldValueResolver.java:214)
        ... 22 more

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions