On Tue, 7 Jan 2025 19:37:24 GMT, Rajat Mahajan <[email protected]> wrote:

>> **Issue:** 
>> AwtWindow::SetIconData leaks the old icon handles in hOldIcon and hOldIconSm 
>> if CreateIconFromRaster raises an exception. Additionally, an exception is 
>> checked only after the first call to CreateIconFromRaster.
>> 
>> **Solution:**
>> I have added the exception handling code to take care that the handles are 
>> properly destroyed and not leaked.
>> 
>> **Testing:**
>> I have tested the code to make sure there are no regressions caused by this.
>
> Rajat Mahajan has updated the pull request incrementally with one additional 
> commit since the last revision:
> 
>   Update copyright year

The suggested fix does not address the reported issue yet: both `hOldIcon` and 
`hOldIconSm` are still leaked if the function exists prematurely.

Based on my above comments, I suggest restructuring the code.

1. Create new icons using `CreateIconFromRaster`. Do not assign the handles to 
member fields `m_hIcon` and `m_hIconSm` just yet.
2. Wrap the calls to `CreateIconFromRaster` in step 1 into a try-catch block to 
prevent a C++ exception escaping from JNI code as well as ensure a Java 
exception isn't raised.
    1. If any exception occurs, destroy the newly created icon handles 
(`(new_)hIcon` and `(new_)hIconSm`) and exit.  
       In this case both `m_hIcon` and `m_hIconSm` remain unmodified—the 
current icons remain unchanged.
    2. If no exception occurs,
        1. Assign the old values of `m_hIcon` and `m_hIconSm` to temporary 
variables (`hOldIcon` and `hOldIconSm`),  
            ~~or call `DestroyIcon` right on the member fields `m_*`~~;
        2. Assign the newly created icons to the member fields `m_hIcon` and 
`m_hIconSm` and execute the code below to update the inherited icons;
        3. Call `DestroyIcon` on `hOldIcon` and `hOldIconSm`.

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

PR Comment: https://git.openjdk.org/jdk/pull/22932#issuecomment-2584089564

Reply via email to