-
Notifications
You must be signed in to change notification settings - Fork 5.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
8284680: sun.font.FontConfigManager.getFontConfig() leaks charset #8187
8284680: sun.font.FontConfigManager.getFontConfig() leaks charset #8187
Conversation
👋 Welcome back zgu! A progress list of the required criteria for merging this PR into |
@zhengyu123 The following label 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 list. If you would like to change these labels, use the /label pull request command. |
Webrevs
|
/reviewers 2 |
@zhengyu123 This change now passes all automated pre-integration checks. ℹ️ This project also has non-automated pre-integration requirements. Please see the file CONTRIBUTING.md for details. After integration, the commit message for the final commit will be:
You can use pull request commands such as /summary, /contributor and /issue to adjust it as needed. At the time when this comment was updated there had been 423 new commits pushed to the
As there are no conflicts, your changes will automatically be rebased on top of these commits when integrating. If you prefer to avoid this automatic rebasing, please check the documentation for the /integrate command for further details. ➡️ To integrate this PR with the above commit message to the |
@prrace |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ok, let me see if I follow this correctly.
The main logic to call FcCharSetDestroy
is within two loops. The outermost loop declares unionCharset
. The inner loop declares charset
.
On each of the iterations of the inner loop, charset
is newly defined and obtains a character set via FcPatternGetString
. This character set is not a copy and doesn't need to be freed.
I thus assume the need to free comes from the return value of FcCharSetUnion
. On each iteration of the inner loop, this is used to add more characters to the character set pointed to by unionCharset
.
On iteration 0, unionCharset
is NULL so it is assigned charset
, which is the character set for fontset->fonts[0]
.
On iteration 1, unionCharset
is now the charset for fontset->fonts[0]
. charset
will be redefined and set to the character set for fontset->fonts[1]
.
I see a problem on this iteration. currentUnionSet
will be set to the character set for fontset->fonts[0]
and unionCharset
will then be allocated a new character set consisting of the union of the characters in the sets for fontset->fonts[0]
(in currentUnionSet
) and fontset->fonts[1]
(in charset
). How will currentUnionSet
ever be equal to charset
in this case?
Unless I'm missing something, the second iteration is going to wrongly attempt to free the character set allocated in the first iteration.
For subsequent iterations, the free is fine, because it is indeed releasing the previous union.
A possible solution would be to introduce another variable e.g. previousUnion
which is only set after the first union is created. The problem with using unionCharset is it is set to charset
on the first iteration.
So something like:
unionCharset = (* FcCharSetUnion)(unionCharset, charset);
if (previousUnion != NULL) {
(*FcCharSetDestroy)(previousUnion);
}
previousUnion = unionCharset;
Hmmm, you are right. Phil probably pointed out the same problem, but I misunderstood it. What's odd is that, I tested (made sure that With your suggested fix, I think we still leak last |
That's fixed by your addition at the end, right? I assumed the final unionCharset was used for something, but it never seems to actually be read, just continually added to and then drops out of scope. It may also need to be freed in the |
Right, updated. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks good to me. Hopefully we caught everything.
Thanks @gnu-andrew. |
Thanks @prrace for the review. |
/integrate |
Going to push as commit dea6e88.
Your commit was automatically rebased without conflicts. |
@zhengyu123 Pushed as commit dea6e88. 💡 You may see a message that your pull request was closed with unmerged commits. This can be safely ignored. |
Please review this small patch that releases temporary charsets to avoid memory leak.
Test:
Progress
Issue
Reviewers
Reviewing
Using
git
Checkout this PR locally:
$ git fetch https://git.openjdk.java.net/jdk pull/8187/head:pull/8187
$ git checkout pull/8187
Update a local copy of the PR:
$ git checkout pull/8187
$ git pull https://git.openjdk.java.net/jdk pull/8187/head
Using Skara CLI tools
Checkout this PR locally:
$ git pr checkout 8187
View PR using the GUI difftool:
$ git pr show -t 8187
Using diff file
Download this PR as a diff file:
https://git.openjdk.java.net/jdk/pull/8187.diff