Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

loading jruby ext can fail with NullPointerException #711

Open
kares opened this issue Jan 28, 2025 · 2 comments
Open

loading jruby ext can fail with NullPointerException #711

kares opened this issue Jan 28, 2025 · 2 comments

Comments

@kares
Copy link
Contributor

kares commented Jan 28, 2025

in an embedded use-case (e.g. with jar-dependencies instructed to use the snakeyaml from the parent class-path)
the input stream (for META-INF/maven/org.snakeyaml/snakeyaml-engine/pom.properties) can easily end up as null:

NameError: cannot load (ext) (org.jruby.ext.psych.PsychLibrary)
  org/jruby/ext/jruby/JRubyUtilLibrary.java:219:in `load_ext'
  uri:classloader:/META-INF/jruby.home/lib/ruby/stdlib/psych.rb:9:in `<main>'
  org/jruby/RubyKernel.java:1187:in `require'
  uri:classloader:/META-INF/jruby.home/lib/ruby/stdlib/rubygems/core_ext/kernel_require.rb:148:in `require'
  uri:classloader:/META-INF/jruby.home/lib/ruby/stdlib/rubygems.rb:610:in `load_yaml'
  uri:classloader:/META-INF/jruby.home/lib/ruby/stdlib/rubygems/package.rb:549:in `read_checksums'
  uri:classloader:/META-INF/jruby.home/lib/ruby/stdlib/rubygems/package.rb:611:in `block in verify'
  uri:classloader:/META-INF/jruby.home/lib/ruby/stdlib/rubygems/package/tar_reader.rb:27:in `new'
  uri:classloader:/META-INF/jruby.home/lib/ruby/stdlib/rubygems/package.rb:610:in `block in verify'
  org/jruby/RubyIO.java:1198:in `open'
  uri:classloader:/META-INF/jruby.home/lib/ruby/stdlib/rubygems/package/file_source.rb:29:in `with_read_io'
  uri:classloader:/META-INF/jruby.home/lib/ruby/stdlib/rubygems/package.rb:609:in `verify'
  uri:classloader:/META-INF/jruby.home/lib/ruby/stdlib/rubygems/package.rb:590:in `spec'
  uri:classloader:/META-INF/jruby.home/lib/ruby/stdlib/bundler/rubygems_integration.rb:208:in `spec_from_gem'
  uri:classloader:/META-INF/jruby.home/lib/ruby/stdlib/bundler/runtime.rb:218:in `block in prune_gem_cache'
  org/jruby/RubyArray.java:3149:in `delete_if'
  uri:classloader:/META-INF/jruby.home/lib/ruby/stdlib/bundler/runtime.rb:217:in `prune_gem_cache'
  uri:classloader:/META-INF/jruby.home/lib/ruby/stdlib/bundler/runtime.rb:144:in `prune_cache'
  uri:classloader:/META-INF/jruby.home/lib/ruby/stdlib/bundler/runtime.rb:136:in `cache'
  uri:classloader:/META-INF/jruby.home/lib/ruby/stdlib/bundler/cli/install.rb:65:in `block in run'
  uri:classloader:/META-INF/jruby.home/lib/ruby/stdlib/bundler/settings.rb:131:in `temporary'
  uri:classloader:/META-INF/jruby.home/lib/ruby/stdlib/bundler/cli/install.rb:64:in `run'
  uri:classloader:/META-INF/jruby.home/lib/ruby/stdlib/bundler/cli.rb:257:in `block in install'
  uri:classloader:/META-INF/jruby.home/lib/ruby/stdlib/bundler/settings.rb:131:in `temporary'
  uri:classloader:/META-INF/jruby.home/lib/ruby/stdlib/bundler/cli.rb:256:in `install'
  uri:classloader:/META-INF/jruby.home/lib/ruby/stdlib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
  uri:classloader:/META-INF/jruby.home/lib/ruby/stdlib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
  uri:classloader:/META-INF/jruby.home/lib/ruby/stdlib/bundler/vendor/thor/lib/thor.rb:392:in `dispatch'
  uri:classloader:/META-INF/jruby.home/lib/ruby/stdlib/bundler/cli.rb:31:in `dispatch'
  uri:classloader:/META-INF/jruby.home/lib/ruby/stdlib/bundler/vendor/thor/lib/thor/base.rb:485:in `start'
  uri:classloader:/META-INF/jruby.home/lib/ruby/stdlib/bundler/cli.rb:25:in `start'
  bin/bundle:33:in `block in <main>'
  uri:classloader:/META-INF/jruby.home/lib/ruby/stdlib/bundler/friendly_errors.rb:120:in `with_friendly_errors'
  bin/bundle:25:in `<main>'
Java::JavaLang::NullPointerException: inStream parameter is null
  java.base/java.util.Objects.requireNonNull(Objects.java:246)
  java.base/java.util.Properties.load(Properties.java:406)
  org.jruby.ext.psych.PsychLibrary.load(PsychLibrary.java:57)
  org.jruby.ext.jruby.JRubyUtilLibrary.loadExtension(JRubyUtilLibrary.java:242)
  org.jruby.ext.jruby.JRubyUtilLibrary.load_ext(JRubyUtilLibrary.java:219)
  org.jruby.ext.jruby.JRubyUtilLibrary$INVOKER$s$1$0$load_ext.call(JRubyUtilLibrary$INVOKER$s$1$0$load_ext.gen)
  org.jruby.runtime.callsite.CachingCallSite.cacheAndCall(CachingCallSite.java:466)
  org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:244)
  org.jruby.ir.interpreter.InterpreterEngine.processCall(InterpreterEngine.java:314)
  org.jruby.ir.interpreter.StartupInterpreterEngine.interpret(StartupInterpreterEngine.java:66)
  org.jruby.ir.interpreter.Interpreter.INTERPRET_ROOT(Interpreter.java:98)
  org.jruby.ir.interpreter.Interpreter.execute(Interpreter.java:83)
  org.jruby.ir.interpreter.Interpreter.execute(Interpreter.java:32)
  org.jruby.ir.IRTranslator.execute(IRTranslator.java:41)
  org.jruby.Ruby.runInterpreter(Ruby.java:1269)
  org.jruby.Ruby.loadFile(Ruby.java:3060)

and extra != null check should be added https://github.com/ruby/psych/blob/master/ext/java/org/jruby/ext/psych/PsychLibrary.java#L57

@headius
Copy link
Contributor

headius commented Jan 28, 2025

Looks like this is some original code from way back. I will have time to dig into this more after FOSDEM.

Do you think the null check and fallback would be sufficient?

@kares
Copy link
Contributor Author

kares commented Jan 29, 2025

Should be sufficient (there's already fallback for IOException), the down side is going to be a "invalid" 0.0 snakeyaml version constant.

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

No branches or pull requests

2 participants