Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Conversation

enebo
Copy link
Member

@enebo enebo commented Jul 5, 2025

This was quickest and minimal needed to work to get a profile which can load a Ruby runtime. It is not really correct and is meant as a starting point.

There are some obvious problems with profile as it is defined. Basic fundamental things like primal Exception types need to be loaded. Allowing people to omit them is a footgun.

There is obvious issues with ommitting jruby/kernel. Some of that is required but at the same time it likely hits profile excluded types.

Regex is a major source of DOS so it must be excludable but at the same time I suspect we call it many places internally.

Methods which use types which are excludable (like Regexp) probably should be aware of excluded types and not bind. This would be a MAJOR amount of work but it would fit into idea of a dependency graph. Likewise we could make a much smarter type declaration where something like:

        return defineClass(context, "Integer", Numeric, NOT_ALLOCATABLE_ALLOCATOR).
                reifiedClass(RubyInteger.class).
                kindOf(new RubyModule.JavaClassKindOf(RubyInteger.class)).
                classIndex(ClassIndex.INTEGER).
                defineMethods(context, RubyInteger.class).
                tap(c-> c.singletonClass(context).undefMethods(context, "new"));

(we are only pretending with this example as Integer is too primal to Ruby to be allowed to be excluded) we would want to add something to this which would know that it cannot defineClass unless "Numeric" has been defined.

        return  requires("Numeric", "Fixnum", "Bignum").
                defineClass(context, "Integer", Numeric, NOT_ALLOCATABLE_ALLOCATOR).
                reifiedClass(RubyInteger.class).
                kindOf(new RubyModule.JavaClassKindOf(RubyInteger.class)).
                classIndex(ClassIndex.INTEGER).
                defineMethods(context, RubyInteger.class).
                tap(c-> c.singletonClass(context).undefMethods(context, "new"));

This would end up simplifying the smattering of if's in Ruby to just declare these dependencies in the setup method for the type.

This was quickest and minimal needed to work to get a profile which
can load a Ruby runtime.  It is not really correct and is meant as a
starting point.

There are some obvious problems with profile as it is defined.  Basic
fundamental things like primal Exception types need to be loaded.  Allowing
people to omit them is a footgun.

There is obvious issues with ommitting jruby/kernel.  Some of that is
required but at the same time it likely hits profile excluded types.

Regex is a major source of DOS so it must be excludable but at the same
time I suspect we call it many places internally.

Methods which use types which are excludable (like Regexp) probably should
be aware of excluded types and not bind.  This would be a MAJOR amount of
work but it would fit into idea of a dependency graph.  Likewise we could
make a much smarter type declaration where something like:

```java
        return defineClass(context, "Integer", Numeric, NOT_ALLOCATABLE_ALLOCATOR).
                reifiedClass(RubyInteger.class).
                kindOf(new RubyModule.JavaClassKindOf(RubyInteger.class)).
                classIndex(ClassIndex.INTEGER).
                defineMethods(context, RubyInteger.class).
                tap(c-> c.singletonClass(context).undefMethods(context, "new"));
```

(we are only pretending with this example as Integer is too primal to Ruby
to be allowed to be excluded) we would want to add something to this which
would know that it cannot defineClass unless "Numeric" has been defined.

```java
        return  requires("Numeric", "Fixnum", "Bignum").
                defineClass(context, "Integer", Numeric, NOT_ALLOCATABLE_ALLOCATOR).
                reifiedClass(RubyInteger.class).
                kindOf(new RubyModule.JavaClassKindOf(RubyInteger.class)).
                classIndex(ClassIndex.INTEGER).
                defineMethods(context, RubyInteger.class).
                tap(c-> c.singletonClass(context).undefMethods(context, "new"));
```

This would end up simplifying the smattering of if's in Ruby to just declare
these dependencies in the setup method for the type.
@enebo enebo added this to the JRuby 10.0.1.0 milestone Jul 5, 2025
assertEquals(result, "uri:" + url);
}

class CustomProfile implements Profile {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe call it RestrictedProfile to match the name the test has?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@NinekoTheCat sure. I can change this name in the test. Ultimately this class may get very small as we continue.

headius added a commit to headius/jruby that referenced this pull request Jul 9, 2025
This moves IO-related Kernel methods to a separate interface which
can be enabled or disabled independently of the rest of Kernel.
This relates to recent discussions about making JRuby safely
embeddable with only specific classes and features loaded.

See other work in jruby#8893
headius added a commit to headius/jruby that referenced this pull request Jul 9, 2025
This moves IO-related Kernel methods to a separate interface which
can be enabled or disabled independently of the rest of Kernel.
This relates to recent discussions about making JRuby safely
embeddable with only specific classes and features loaded.

See other work in jruby#8893
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

Morty Proxy This is a proxified and sanitized view of the page, visit original site.