8380391: Update java.smartcardio finalizer to use Cleaner#30683
8380391: Update java.smartcardio finalizer to use Cleaner#30683bchristi-git wants to merge 10 commits into
Conversation
|
👋 Welcome back bchristi! A progress list of the required criteria for merging this PR into |
|
❗ This change is not yet ready to be integrated. |
|
@bchristi-git The following labels will be automatically applied to this pull request:
When this pull request is ready to be reviewed, an "RFR" email will be sent to the corresponding mailing lists. If you would like to change these labels, use the /label pull request command. |
Webrevs
|
Has there been any static analysis done to get some sense as to how common it is to not disconnect a connection to a card or close a card channel? Asking because it would be nice if we could just remove the undocumented use of the finalizer. Related is that the example in the package example should be using try-finally to ensure that disconnect is called (I'm sure there has been discussed about having Card and CardChannel implement AutoClosable but the smartcard API is a bit awkward in that's a standalone technology, not part of Java SE but happens to be bundled with the JDK). |
I'll look into it, Alan. Thanks. |
Static analysis turned up several artifacts/libraries where a
I updated the example to use try-finally. |
| checkSecurity("exclusive"); | ||
| checkState(); |
There was a problem hiding this comment.
What's the reason that these checks are done within the try-finally whereas the openLogicalChannel()-checks are done outside of the try-finally?
There was a problem hiding this comment.
I think maybe github is rendering diffs in a confusing way?
In all cases, I add a new, outer try/finally block (for the reachabilityFence()) around the existing code.
openLogicalChannel() has the checks within this new try/finally block, as do the other methods.
Try enabling "Hide whitespace" (in the "gear" menu) and hopefully that will look better.
| } catch (PCSCException e) { | ||
| handleError(e); | ||
| throw new CardException("endExclusive() failed", e); | ||
| checkState(); |
There was a problem hiding this comment.
Same comment as https://github.com/openjdk/jdk/pull/30683/changes#r3280643716
| checkSecurity("transmitControl"); | ||
| checkState(); | ||
| checkExclusive(); |
There was a problem hiding this comment.
Same comment as https://github.com/openjdk/jdk/pull/30683/changes#r3280643716
| if (reset) { | ||
| checkSecurity("reset"); | ||
| } | ||
| if (context.state != State.OK) { | ||
| return; | ||
| } | ||
| checkExclusive(); |
There was a problem hiding this comment.
Same comment as https://github.com/openjdk/jdk/pull/30683/changes#r3280643716
viktorklang-ora
left a comment
There was a problem hiding this comment.
Did another review pass over this PR, after comments are answered/possibly addressed, this looks good to go from me
This is a pull request to convert the finalizer in
sun.security.smartcardio.CardImplto use Cleaner instead. The relevant state is refactored into a Context object, in the standard fashion.This change uses the recommended
try/finally/reachabilityFence()technique to prevent races between the program thread and the Cleaner thread, per theReference.reachabilityFence()API Note:See Reference.reachabilityFence() and java.lang.ref - Memory Visibility for details / background info.
The test creates a
Cardobject, and allows it to be collected. This confirms that the new cleaning action does not hold onto the Owner ("this") object, per the Cleaner class API Note ("it is important that the object implementing the cleaning action does not hold references to the object").I've tried to make the test similar to nearby JavaCard tests. I tried it on Windows using the latest JavaCard Simulator.
Progress
Issue
Reviewers
Reviewing
Using
gitCheckout this PR locally:
$ git fetch https://git.openjdk.org/jdk.git pull/30683/head:pull/30683$ git checkout pull/30683Update a local copy of the PR:
$ git checkout pull/30683$ git pull https://git.openjdk.org/jdk.git pull/30683/headUsing Skara CLI tools
Checkout this PR locally:
$ git pr checkout 30683View PR using the GUI difftool:
$ git pr show -t 30683Using diff file
Download this PR as a diff file:
https://git.openjdk.org/jdk/pull/30683.diff
Using Webrev
Link to Webrev Comment