On Mon, 1 Feb 2021 09:00:18 GMT, Sergey Bylokhov <s...@openjdk.org> wrote:

> Both methods are implemented in a similar way.
>  1. Requests the size of the profile/tag data
>  2. Creates an array of the correct size
>  3. Requests the data and copy it to the array
> 
> If the data will be changed concurrently between steps 2. and 3. then we will 
> get a mismatch between the array and copied data. 
> 
> In the fix, all steps above are merged to just one step return the data when 
> requested.

src/java.desktop/share/classes/java/awt/color/ICC_Profile.java line 1210:

> 1208:     public byte[] getData() {
> 1209:         activate();
> 1210:         return CMSManager.getModule().getProfileData(cmmProfile);

Just one step, the array will be created in the native code under proper 
synchronization.

src/java.desktop/share/classes/java/awt/color/ICC_Profile.java line 1236:

> 1234:     private static byte[] getData(Profile p, int tagSignature) {
> 1235:         try {
> 1236:             return CMSManager.getModule().getTagData(p, tagSignature);

Just one step, the array will be created in the native code under proper 
synchronization.

src/java.desktop/share/native/liblcms/LCMS.c line 330:

> 328:     }
> 329: 
> 330:     jbyteArray data = (*env)->NewByteArray(env, pfSize);

Here we create the new array.

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

PR: https://git.openjdk.java.net/jdk/pull/2330

Reply via email to