1diff --git a/third_party/lcms/src/cmscgats.c b/third_party/lcms/src/cmscgats.c
2index a0c25c024..55f74ede8 100644
3--- a/third_party/lcms/src/cmscgats.c
4+++ b/third_party/lcms/src/cmscgats.c
5@@ -38,7 +38,10 @@
6 #define DEFAULT_DBL_FORMAT  "%.10g" // Double formatting
7 
8 #ifdef CMS_IS_WINDOWS_
9-#    include <io.h>
10+//sunliang.liu modified 2010426 for wince error
11+# ifndef _WIN32_WCE
12+#   include <io.h>
13+# endif
14 #    define DIR_CHAR    '\\'
15 #else
16 #    define DIR_CHAR    '/'
17diff --git a/third_party/lcms/src/cmsgamma.c b/third_party/lcms/src/cmsgamma.c
18index eb3dd881c..6e36cf462 100644
19--- a/third_party/lcms/src/cmsgamma.c
20+++ b/third_party/lcms/src/cmsgamma.c
21@@ -749,14 +749,19 @@ void CMSEXPORT cmsFreeToneCurve(cmsToneCurve* Curve)
22 {
23     cmsContext ContextID;
24 
25-    if (Curve == NULL) return;
26+    // added by Xiaochuan Liu
27+    // Curve->InterpParams may be null
28+    if (Curve == NULL || Curve->InterpParams == NULL) return;
29 
30     ContextID = Curve ->InterpParams->ContextID;
31 
32     _cmsFreeInterpParams(Curve ->InterpParams);
33+    Curve ->InterpParams = NULL;
34 
35-    if (Curve -> Table16)
36+    if (Curve -> Table16) {
37         _cmsFree(ContextID, Curve ->Table16);
38+        Curve ->Table16 = NULL;
39+    }
40 
41     if (Curve ->Segments) {
42 
43@@ -766,20 +771,30 @@ void CMSEXPORT cmsFreeToneCurve(cmsToneCurve* Curve)
44 
45             if (Curve ->Segments[i].SampledPoints) {
46                 _cmsFree(ContextID, Curve ->Segments[i].SampledPoints);
47+                Curve ->Segments[i].SampledPoints = NULL;
48             }
49 
50-            if (Curve ->SegInterp[i] != 0)
51+            if (Curve ->SegInterp[i] != 0) {
52                 _cmsFreeInterpParams(Curve->SegInterp[i]);
53+                Curve->SegInterp[i] = NULL;
54+            }
55         }
56 
57         _cmsFree(ContextID, Curve ->Segments);
58+        Curve ->Segments = NULL;
59         _cmsFree(ContextID, Curve ->SegInterp);
60+        Curve ->SegInterp = NULL;
61     }
62 
63-    if (Curve -> Evals)
64+    if (Curve -> Evals) {
65         _cmsFree(ContextID, Curve -> Evals);
66+        Curve -> Evals = NULL;
67+    }
68 
69-    if (Curve) _cmsFree(ContextID, Curve);
70+    if (Curve) {
71+        _cmsFree(ContextID, Curve);
72+        Curve = NULL;
73+    }
74 }
75 
76 // Utility function, free 3 gamma tables
77@@ -799,7 +814,10 @@ void CMSEXPORT cmsFreeToneCurveTriple(cmsToneCurve* Curve[3])
78 // Duplicate a gamma table
79 cmsToneCurve* CMSEXPORT cmsDupToneCurve(const cmsToneCurve* In)
80 {
81-    if (In == NULL || In ->Segments == NULL || In ->Table16 == NULL) return NULL;
82+    // Xiaochuan Liu
83+    // fix openpdf bug(mantis id:0055683, google id:360198)
84+    // the function CurveSetElemTypeFree in cmslut.c also needs to check pointer
85+    if (In == NULL || In ->InterpParams == NULL || In ->Segments == NULL || In ->Table16 == NULL) return NULL;
86 
87     return  AllocateToneCurveStruct(In ->InterpParams ->ContextID, In ->nEntries, In ->nSegments, In ->Segments, In ->Table16);
88 }
89diff --git a/third_party/lcms/src/cmsio0.c b/third_party/lcms/src/cmsio0.c
90index 1b026488d..cc5f89064 100644
91--- a/third_party/lcms/src/cmsio0.c
92+++ b/third_party/lcms/src/cmsio0.c
93@@ -479,6 +479,14 @@ cmsIOHANDLER* CMSEXPORT cmsGetProfileIOhandler(cmsHPROFILE hProfile)
94        return Icc->IOhandler;
95 }
96 
97+#ifdef _WIN32_WCE
98+time_t wceex_time(time_t *timer);
99+struct tm * wceex_gmtime(const time_t *timer);
100+
101+#define time wceex_time
102+#define gmtime wceex_gmtime
103+#endif
104+
105 // Creates an empty structure holding all required parameters
106 cmsHPROFILE CMSEXPORT cmsCreateProfilePlaceholder(cmsContext ContextID)
107 {
108@@ -570,6 +578,14 @@ int _cmsSearchTag(_cmsICCPROFILE* Icc, cmsTagSignature sig, cmsBool lFollowLinks
109 
110         // Yes, follow link
111         if (LinkedSig != (cmsTagSignature) 0) {
112+            // fix bug mantis id#0055942
113+            // assume that TRCTag and ColorantTag can't be linked.
114+            // Xiaochuan Liu 2014-04-23
115+            if ((sig == cmsSigRedTRCTag || sig == cmsSigGreenTRCTag || sig == cmsSigBlueTRCTag) && 
116+                (LinkedSig == cmsSigRedColorantTag || LinkedSig == cmsSigGreenColorantTag || LinkedSig == cmsSigBlueColorantTag))
117+            {
118+                return n;
119+            }
120             sig = LinkedSig;
121         }
122 
123@@ -1363,6 +1379,12 @@ Error:
124     return 0;
125 }
126 
127+#ifdef _WIN32_WCE
128+int wceex_unlink(const char *filename);
129+#ifndef remove
130+#   define remove wceex_unlink
131+#endif
132+#endif
133 
134 // Low-level save to disk.
135 cmsBool  CMSEXPORT cmsSaveProfileToFile(cmsHPROFILE hProfile, const char* FileName)
136diff --git a/third_party/lcms/src/cmsio1.c b/third_party/lcms/src/cmsio1.c
137index 364741c9e..4b12ae18e 100644
138--- a/third_party/lcms/src/cmsio1.c
139+++ b/third_party/lcms/src/cmsio1.c
140@@ -201,7 +201,11 @@ cmsPipeline* BuildGrayInputMatrixPipeline(cmsHPROFILE hProfile)
141     return Lut;
142 
143 Error:
144-    cmsFreeToneCurve(GrayTRC);
145+    // memory pointed by GrayTRC is not a new malloc memory, so don't free it here, 
146+    // memory pointed by GrayTRC will be freed when hProfile is closed.
147+    // test file :0047776_Pocket Medicine_ The Massachusetts General Hospital Handbook of Internal Medicine-2.pdf
148+    // Xiaochuan Liu, 20140421
149+    //cmsFreeToneCurve(GrayTRC);
150     cmsPipelineFree(Lut);
151     return NULL;
152 }
153