Skip to content

Auto-port 4.1: Don't assume CertificateFactory is thread-safe#16364

Merged
normanmaurer merged 2 commits into
4.1from
auto-port-pr-16350-to-4.1
Feb 26, 2026
Merged

Auto-port 4.1: Don't assume CertificateFactory is thread-safe#16364
normanmaurer merged 2 commits into
4.1from
auto-port-pr-16350-to-4.1

Conversation

@netty-project-bot

Copy link
Copy Markdown
Contributor

Auto-port of #16350 to 4.1
Cherry-picked commit: 8e147e5


Motivation:
We cannot assume that CertificateFactory implementations are thread-safe, since they contain complicated parsing logic which may be implemented as stateful operations depending on the particular provider used at runtime.

Modification:
Remove the singleton instance and just create a new CertificateFactory every time.
Creating these factories should not be the most expensive thing, regardless of provider used.

Made the wrapped field volatile to ensure visibility across threads, effectively obtaining safe publication for the X509Certificate object. This is important because X509Certificate, just like the CertificateFactory, may have any number of implementations at runtime and there are no guarantees about their thread-safety or immutability.

Made the test dig into the SANs and compare the data directly, instead of relying on the Collection.equals implementation, which could be anything, just like with the other objects above.

Result:
LazyX509Certificate is now thread-safe.

Should fix weird flaky test failures, such as:

[ERROR] Failures:
[ERROR]   LazyX509CertificateTest.testLazyX509Certificate:83 expected: java.util.Collections$UnmodifiableCollection@757bd65c<[[2, www.foo.com]]> but was: java.util.Collections$UnmodifiableCollection@2c32b649<[[2, www.foo.com]]>

Motivation:
We cannot assume that `CertificateFactory` implementations are
thread-safe, since they contain complicated parsing logic which may be
implemented as stateful operations depending on the particular provider
used at runtime.

Modification:
Remove the singleton instance and just create a new `CertificateFactory`
every time.
Creating these factories should not be the most expensive thing,
regardless of provider used.

Made the `wrapped` field volatile to ensure visibility across threads,
effectively obtaining safe publication for the `X509Certificate` object.
This is important because `X509Certificate`, just like the
`CertificateFactory`, may have any number of implementations at runtime
and there are no guarantees about their thread-safety or immutability.

Made the test dig into the SANs and compare the data directly, instead
of relying on the `Collection.equals` implementation, which could be
anything, just like with the other objects above.

Result:
`LazyX509Certificate` is now thread-safe.

Should fix weird flaky test failures, such as:

```
[ERROR] Failures:
[ERROR]   LazyX509CertificateTest.testLazyX509Certificate:83 expected: java.util.Collections$UnmodifiableCollection@757bd65c<[[2, www.foo.com]]> but was: java.util.Collections$UnmodifiableCollection@2c32b649<[[2, www.foo.com]]>
```

(cherry picked from commit 8e147e5)
@normanmaurer normanmaurer merged commit ccf03c4 into 4.1 Feb 26, 2026
19 checks passed
@normanmaurer normanmaurer deleted the auto-port-pr-16350-to-4.1 branch February 26, 2026 07:39
@normanmaurer normanmaurer added this to the 4.1.132.Final milestone Feb 26, 2026
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