RFR: 8278087: Deserialization filter and filter factory property error reporting under specified

Jaikiran Pai jpai at openjdk.java.net
Mon Dec 6 04:54:16 UTC 2021


On Wed, 1 Dec 2021 18:19:05 GMT, Roger Riggs <rriggs at openjdk.org> wrote:

> The effects of invalid values of `jdk.serialFilter` and `jdk.serialFilterFactory` properties are 
> incompletely specified. The behavior for invalid values of the properties is different and
> use an unconventional exception type, `ExceptionInInitializerError` and leave the `OIF.Config` class
> uninitialized. 
> 
> The exceptions in the `ObjectInputFilter.Config` class initialization caused by invalid values of the two properties, 
> either by system properties supplied on the command line or security properties are logged.
> The `Config` class marks either or both the filter and filter factory values as unusable
> and remembers the exception message.
> 
> Subsequent calls to the methods that get or set the filter or filter factory or create 
> an `ObjectInputStream` throw `java.lang.IllegalStateException` with the remembered exception message.
> Constructing an `ObjectInputStream` calls both `Config.getSerialFilter` and `Config.getSerialFilterFactory`.
> The nature of the invalid property is reported as an `IllegalStateException` on first use.
> 
> This PR supercedes https://github.com/openjdk/jdk/pull/6508 Document that setting an invalid property jdk.serialFilter disables deserialization

src/java.base/share/classes/java/io/ObjectInputFilter.java line 526:

> 524:      * {@code jdk.serialFilter} is defined then it is used to configure the filter.
> 525:      * The filter is created as if {@link #createFilter(String) createFilter} is called,
> 526:      * if the filter string is invalid the initialization fails and subsequent attempts to

Hello Roger,
> if the filter string is invalid the initialization fails

Should this instead be "if the filter string is invalid the initialization of {@code Config} class fails ..."

src/java.base/share/classes/java/io/ObjectInputFilter.java line 527:

> 525:      * The filter is created as if {@link #createFilter(String) createFilter} is called,
> 526:      * if the filter string is invalid the initialization fails and subsequent attempts to
> 527:      * {@linkplain Config#getSerialFilter() get the filter}, {@link Config#setSerialFilter set a filter},

> {@link Config#setSerialFilter set a filter}

Should this instead be "{@link Config#setSerialFilter(ObjectInputFilter)  set a filter}" i.e. include the param as part of the `@link`, like in other places?

src/java.base/share/classes/java/io/ObjectInputFilter.java line 532:

> 530:      * invalid serial filter.
> 531:      * If the system property {@code jdk.serialFilter} or the {@link java.security.Security}
> 532:      * property is not set the filter can be set with

> or the {@link java.security.Security} property is not set the filter can be set ...

Is it intentional that the name of security property is left out here? Perhaps this should be:
 `or the {@link java.security.Security} property {@code jdk.serialFilter} is not set the filter ....`

or even:

`or the {@link java.security.Security} property of the same name is not set the filter....`

src/java.base/share/classes/java/io/ObjectInputFilter.java line 751:

> 749:                 if (serialFilter != null) {
> 750:                     throw new IllegalStateException("Serial filter can only be set once");
> 751:                 } else if (invalidFilterMessage != null) {

The `invalidFilterMessage` is a `static` `final` `String` which gets initialized during the static initialization of the class and as such doesn't get changed after that. Do you think this lock on `serialFilterLock` is necessary for this check or it can be moved outside this `synchronized` block?

src/java.base/share/classes/java/io/ObjectInputFilter.java line 859:

> 857:         /*
> 858:          * Return message for an invalid filter factory configuration saved from the static init.
> 859:          * It can be called before the static initializer is complete and has set the message/null.

More of a curiosity than a review comment - Is that because the `Config.getSerialFilterFactory()/setSerialFilterFactory(...)` could be called from the constructor of the user configured factory class, which gets invoked when static initialization is in progress for the `Config` class?

test/jdk/java/io/Serializable/serialFilter/InvalidGlobalFilterTest.java line 38:

> 36: /*
> 37:  * @test
> 38:  * @bug 8269336

Would this need an update to include the new bug id of this PR?

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

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


More information about the core-libs-dev mailing list