You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ti...@apache.org on 2020/12/25 11:22:15 UTC

svn commit: r1884795 - in /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color: PDDeviceCMYK.java PDDeviceRGB.java

Author: tilman
Date: Fri Dec 25 11:22:14 2020
New Revision: 1884795

URL: http://svn.apache.org/viewvc?rev=1884795&view=rev
Log:
PDFBOX-5056: fix double-checked locking, as suggested by Mike Kaplinskiy; closes #90

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDDeviceCMYK.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDDeviceRGB.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDDeviceCMYK.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDDeviceCMYK.java?rev=1884795&r1=1884794&r2=1884795&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDDeviceCMYK.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDDeviceCMYK.java Fri Dec 25 11:22:14 2020
@@ -47,7 +47,8 @@ public class PDDeviceCMYK extends PDDevi
     }
 
     private final PDColor initialColor = new PDColor(new float[] { 0, 0, 0, 1 }, this);
-    private volatile ICC_ColorSpace awtColorSpace;
+    private ICC_ColorSpace awtColorSpace;
+    private volatile boolean initDone = false;
     private boolean usePureJavaCMYKConversion = false;
 
     protected PDDeviceCMYK()
@@ -60,14 +61,14 @@ public class PDDeviceCMYK extends PDDevi
     protected void init() throws IOException
     {
         // no need to synchronize this check as it is atomic
-        if (awtColorSpace != null)
+        if (initDone)
         {
             return;
         }
         synchronized (this)
         {
             // we might have been waiting for another thread, so check again
-            if (awtColorSpace != null)
+            if (initDone)
             {
                 return;
             }
@@ -85,6 +86,9 @@ public class PDDeviceCMYK extends PDDevi
             awtColorSpace.toRGB(new float[] { 0, 0, 0, 0 });
             usePureJavaCMYKConversion = System
                     .getProperty("org.apache.pdfbox.rendering.UsePureJavaCMYKConversion") != null;
+
+            // Assignment to volatile must be the LAST statement in this block!
+            initDone = true;
         }
     }
 

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDDeviceRGB.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDDeviceRGB.java?rev=1884795&r1=1884794&r2=1884795&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDDeviceRGB.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDDeviceRGB.java Fri Dec 25 11:22:14 2020
@@ -36,7 +36,8 @@ public final class PDDeviceRGB extends P
     public static final PDDeviceRGB INSTANCE = new PDDeviceRGB();
     
     private final PDColor initialColor = new PDColor(new float[] { 0, 0, 0 }, this);
-    private volatile ColorSpace awtColorSpace;
+    private ColorSpace awtColorSpace;
+    private volatile boolean initDone = false;
 
     private PDDeviceRGB()
     {
@@ -48,7 +49,7 @@ public final class PDDeviceRGB extends P
     private void init()
     {
         // no need to synchronize this check as it is atomic
-        if (awtColorSpace != null)
+        if (initDone)
         {
             return;
         }
@@ -56,7 +57,7 @@ public final class PDDeviceRGB extends P
         synchronized (this)
         {
             // we might have been waiting for another thread, so check again
-            if (awtColorSpace != null)
+            if (initDone)
             {
                 return;
             }
@@ -66,6 +67,9 @@ public final class PDDeviceRGB extends P
             // condition caused by lazy initialization of the color transform, so we perform
             // an initial color conversion while we're still synchronized, see PDFBOX-2184
             awtColorSpace.toRGB(new float[] { 0, 0, 0, 0 });
+
+            // This volatile write must be the LAST statement in the synchronized block!
+            initDone = true;
         }
     }