RFR: 8268129: LibraryLookup::ofDefault leaks symbols from loaded libraries [v2]

Paul Sandoz psandoz at openjdk.java.net
Wed Jun 2 20:40:47 UTC 2021


On Wed, 2 Jun 2021 20:17:20 GMT, Maurizio Cimadamore <mcimadamore at openjdk.org> wrote:

>> This patch overhauls the library loading mechanism used by the Foreign Linker API. We realized that, while handy, the *default* lookup abstraction (`LibraryLookup::ofDefault`) was behaving inconsistentlt across platforms.
>> 
>> This patch replaces `LibraryLookup` with a simpler `SymbolLookup` abstraction, a functional interface. Crucially, `SymbolLookup` does not concern with library loading, only symbol lookup. For this reason, two factories are added:
>> 
>> * `SymbolLookup::loaderLookup` - which obtains a lookup that can be used to lookup symbols in libraries loaded by current loader
>> * `CLinker::systemLookup` - a more stable replacement for the *default* lookup, which looks for symbols in libc.so (or its equivalent in other platforms). The contents of this lookup are unspecified.
>> 
>> Both factories are *restricted*, so they can only be called when `--enable-native-access` is set.
>
> Maurizio Cimadamore has updated the pull request incrementally with one additional commit since the last revision:
> 
>   Update test/micro/org/openjdk/bench/jdk/incubator/foreign/points/support/PanamaPoint.java
>   
>   Co-authored-by: Jorn Vernee <JornVernee at users.noreply.github.com>

Looks good. Just minor comments to accept/reject.

The shim library is an interesting approach. I did wonder if the libvm library could be used, but it might have some weird side-effects or bring in more symbols than necessary.

src/jdk.incubator.foreign/share/classes/jdk/incubator/foreign/CLinker.java line 138:

> 136:      * <p>
> 137:      * This method is <a href="package-summary.html#restricted"><em>restricted</em></a>.
> 138:      * Restricted method are unsafe, and, if used incorrectly, their use might crash

Suggestion:

     * Restricted methods are unsafe, and, if used incorrectly, their use might crash

src/jdk.incubator.foreign/share/classes/jdk/incubator/foreign/CLinker.java line 160:

> 158:      * to allocate structs returned by-value.
> 159:      *
> 160:      * @see SymbolLookup

For JDK code it is more common for `@See` to occur after the parameters/return/throws, and before any `@Since`.

src/jdk.incubator.foreign/share/classes/jdk/internal/foreign/abi/SharedUtils.java line 418:

> 416:     private static class AllocHolder {
> 417: 
> 418:         private static final CLinker linker = getSystemLinker();

Suggestion:

        private static final CLinker SYS_LINKER = getSystemLinker();

test/jdk/java/foreign/SafeFunctionAccessTest.java line 53:

> 51:     );
> 52: 
> 53:     static SymbolLookup lookup = SymbolLookup.loaderLookup();

Suggestion:

    static final SymbolLookup LOOKUP = SymbolLookup.loaderLookup();

test/jdk/java/foreign/StdLibTest.java line 158:

> 156:     static class StdLibHelper {
> 157: 
> 158:         final static SymbolLookup LOOKUP;

Suggestion:

        static final SymbolLookup LOOKUP;

test/jdk/java/foreign/TestDowncall.java line 60:

> 58:     }
> 59: 
> 60:     static SymbolLookup lookup = SymbolLookup.loaderLookup();

Suggestion:

    static final SymbolLookup LOOKUP = SymbolLookup.loaderLookup();

test/jdk/java/foreign/TestIllegalLink.java line 48:

> 46: public class TestIllegalLink {
> 47: 
> 48:     private static final MemoryAddress dummyTarget = MemoryAddress.ofLong(1);

Suggestion:

    private static final MemoryAddress DUMMY_TARGET = MemoryAddress.ofLong(1);

test/jdk/java/foreign/TestIntrinsics.java line 60:

> 58:     }
> 59: 
> 60:     static SymbolLookup lookup = SymbolLookup.loaderLookup();

Suggestion:

    static final SymbolLookup LOOKUP = SymbolLookup.loaderLookup();

test/jdk/java/foreign/TestSymbolLookup.java line 50:

> 48:     }
> 49: 
> 50:     static SymbolLookup lookup = SymbolLookup.loaderLookup();

Suggestion:

    static final SymbolLookup LOOKUP = SymbolLookup.loaderLookup();

test/jdk/java/foreign/TestUpcall.java line 69:

> 67:     static CLinker abi = CLinker.getInstance();
> 68: 
> 69:     static SymbolLookup lookup = SymbolLookup.loaderLookup();

Suggestion:

    static final SymbolLookup LOOKUP = SymbolLookup.loaderLookup();

test/jdk/java/foreign/TestVarArgs.java line 68:

> 66:     }
> 67: 
> 68:     static final MemoryAddress varargsAddr =

Suggestion:

    static final MemoryAddress VARARGS_ADDR =

test/jdk/java/foreign/valist/VaListTest.java line 74:

> 72:     }
> 73: 
> 74:     static SymbolLookup lookup = SymbolLookup.loaderLookup();

Suggestion:

    static final SymbolLookup LOOKUP = SymbolLookup.loaderLookup();

-------------

Marked as reviewed by psandoz (Reviewer).

PR: https://git.openjdk.java.net/jdk/pull/4316



More information about the security-dev mailing list