On Fri, 21 Mar 2025 17:39:37 GMT, Harshitha Onkar <hon...@openjdk.org> wrote:

>> Built-in Profiles are singleton objects and if the user happens to modify 
>> this shared profile object via setData() then the modified version of the 
>> profile is returned each time the same built-in profile is requested via 
>> getInstance().
>> 
>> It is good to protect Built-in profiles from such direct modification by 
>> adding BuiltIn profile check in `setData()` such that **only copies** of 
>> Built-In profiles are allowed to be updated.
>> 
>> With the proposed fix, if Built-In profile is updated using `.setData()` it 
>> throws _**IAE - "BuiltIn profile cannot be modified"**_
>> 
>> There are no restrictions on creating copies of BuiltIn profile and then 
>> modifying it, but what is being restricted with this fix is - the direct 
>> modification of the shared BuiltIn profile instance.
>> 
>> Applications which need a modified version of the ICC Profile should instead 
>> do the following:
>> 
>> 
>> byte[] profileData = ICC_Profile.getData() // get the byte array 
>> representation of BuiltIn- profile
>> ICCProfile newProfile = ICC_Profile.getInstance(profileData) // create a new 
>> profile
>> newProfile.setData() // to modify and customize the profile
>> 
>> 
>> Following existing tests are modified to update a copy of Built-In profile.
>> 
>> - java/awt/color/ICC_Profile/SetHeaderInfo.java
>> - java/awt/color/ICC_ProfileSetNullDataTest.java
>> - sun/java2d/cmm/ProfileOp/SetDataTest.java
>
> Harshitha Onkar has updated the pull request with a new target base due to a 
> merge or a rebase. The incremental webrev excludes the unrelated changes 
> brought in by the merge/rebase. The pull request contains 21 additional 
> commits since the last revision:
> 
>  - Merge branch 'master' into BuiltInCheck
>  - updated test to check for all builtIn profiles, serial-deserialization
>  - redudant stmt removed
>  - modifier order changed, added comment to BuiltInProfile
>  - review changes
>  - builtIn converted to transient, tests updated
>  - minor
>  - review changes
>  - doc update
>  - builtIn flag moved to constructor
>  - ... and 11 more: https://git.openjdk.org/jdk/compare/8a3e1b75...7da4c5c7

test/jdk/java/awt/color/ICC_Profile/BuiltInProfileCheck.java line 104:

> 102: 
> 103:     // this test is added to check the ICC_Profile's transient isBuiltIn 
> flag
> 104:     private static void testSerialization(boolean isBuiltIn)

This method does not actually test serialization; instead, it clones/copies the 
ICC profile via the filesystem. This is why you did not get an exception at the 
end of this method, even for a built-in profile.

You should use something like this instead:


ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(iccProfile);


byte[] array = baos.toByteArray();
ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(array));
ICC_Profile iccProfile = (ICC_Profile) ois.readObject();

In the example above, the built-in profile should throw an IAE, but a custom 
profile should not. (I suggest covering all built-in profiles as well).

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

PR Review Comment: https://git.openjdk.org/jdk/pull/23606#discussion_r2008431593

Reply via email to