Check for NULL pointers in CJBig2_SymbolDict::DeepCopy().
[pdfium.git] / core / src / fxcodec / jbig2 / JBig2_ArithIntDecoder.cpp
index bb4e0bb..1e11584 100644 (file)
-// Copyright 2014 PDFium Authors. All rights reserved.\r
-// Use of this source code is governed by a BSD-style license that can be\r
-// found in the LICENSE file.\r
\r
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\r
-\r
-#include "JBig2_ArithIntDecoder.h"\r
-CJBig2_ArithIntDecoder::CJBig2_ArithIntDecoder()\r
-{\r
-    IAx = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), 512);\r
-    JBIG2_memset(IAx, 0, sizeof(JBig2ArithCtx) * 512);\r
-}\r
-CJBig2_ArithIntDecoder::~CJBig2_ArithIntDecoder()\r
-{\r
-    m_pModule->JBig2_Free(IAx);\r
-}\r
-int CJBig2_ArithIntDecoder::decode(CJBig2_ArithDecoder *pArithDecoder, int *nResult)\r
-{\r
-    int PREV, V;\r
-    int S, D;\r
-    int nNeedBits, nTemp, i;\r
-    PREV = 1;\r
-    S = pArithDecoder->DECODE(IAx + PREV);\r
-    PREV = (PREV << 1) | S;\r
-    D = pArithDecoder->DECODE(IAx + PREV);\r
-    PREV = (PREV << 1) | D;\r
-    if(D) {\r
-        D = pArithDecoder->DECODE(IAx + PREV);\r
-        PREV = (PREV << 1) | D;\r
-        if(D) {\r
-            D = pArithDecoder->DECODE(IAx + PREV);\r
-            PREV = (PREV << 1) | D;\r
-            if(D) {\r
-                D = pArithDecoder->DECODE(IAx + PREV);\r
-                PREV = (PREV << 1) | D;\r
-                if(D) {\r
-                    D = pArithDecoder->DECODE(IAx + PREV);\r
-                    PREV = (PREV << 1) | D;\r
-                    if(D) {\r
-                        nNeedBits = 32;\r
-                        V = 4436;\r
-                    } else {\r
-                        nNeedBits = 12;\r
-                        V = 340;\r
-                    }\r
-                } else {\r
-                    nNeedBits = 8;\r
-                    V = 84;\r
-                }\r
-            } else {\r
-                nNeedBits = 6;\r
-                V = 20;\r
-            }\r
-        } else {\r
-            nNeedBits = 4;\r
-            V = 4;\r
-        }\r
-    } else {\r
-        nNeedBits = 2;\r
-        V = 0;\r
-    }\r
-    nTemp = 0;\r
-    for(i = 0; i < nNeedBits; i++) {\r
-        D = pArithDecoder->DECODE(IAx + PREV);\r
-        if(PREV < 256) {\r
-            PREV = (PREV << 1) | D;\r
-        } else {\r
-            PREV = (((PREV << 1) | D) & 511) | 256;\r
-        }\r
-        nTemp = (nTemp << 1) | D;\r
-    }\r
-    V += nTemp;\r
-    if(S == 1 && V > 0) {\r
-        V = -V;\r
-    }\r
-    *nResult = V;\r
-    if(S == 1 && V == 0) {\r
-        return JBIG2_OOB;\r
-    }\r
-    return 0;\r
-}\r
-CJBig2_ArithIaidDecoder::CJBig2_ArithIaidDecoder(unsigned char SBSYMCODELENA)\r
-{\r
-    SBSYMCODELEN = SBSYMCODELENA;\r
-    IAID = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), (1 << SBSYMCODELEN));\r
-    JBIG2_memset(IAID, 0, sizeof(JBig2ArithCtx) * (int)(1 << SBSYMCODELEN));\r
-}\r
-CJBig2_ArithIaidDecoder::~CJBig2_ArithIaidDecoder()\r
-{\r
-    m_pModule->JBig2_Free(IAID);\r
-}\r
-int CJBig2_ArithIaidDecoder::decode(CJBig2_ArithDecoder *pArithDecoder, int *nResult)\r
-{\r
-    int PREV;\r
-    int D;\r
-    int i;\r
-    PREV = 1;\r
-    for(i = 0; i < SBSYMCODELEN; i++) {\r
-        D = pArithDecoder->DECODE(IAID + PREV);\r
-        PREV = (PREV << 1) | D;\r
-    }\r
-    PREV = PREV - (1 << SBSYMCODELEN);\r
-    *nResult = PREV;\r
-    return 0;\r
-}\r
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "JBig2_ArithIntDecoder.h"
+CJBig2_ArithIntDecoder::CJBig2_ArithIntDecoder()
+{
+    IAx = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), 512);
+    JBIG2_memset(IAx, 0, sizeof(JBig2ArithCtx) * 512);
+}
+CJBig2_ArithIntDecoder::~CJBig2_ArithIntDecoder()
+{
+    m_pModule->JBig2_Free(IAx);
+}
+int CJBig2_ArithIntDecoder::decode(CJBig2_ArithDecoder *pArithDecoder, int *nResult)
+{
+    int PREV, V;
+    int S, D;
+    int nNeedBits, nTemp, i;
+    PREV = 1;
+    S = pArithDecoder->DECODE(IAx + PREV);
+    PREV = (PREV << 1) | S;
+    D = pArithDecoder->DECODE(IAx + PREV);
+    PREV = (PREV << 1) | D;
+    if(D) {
+        D = pArithDecoder->DECODE(IAx + PREV);
+        PREV = (PREV << 1) | D;
+        if(D) {
+            D = pArithDecoder->DECODE(IAx + PREV);
+            PREV = (PREV << 1) | D;
+            if(D) {
+                D = pArithDecoder->DECODE(IAx + PREV);
+                PREV = (PREV << 1) | D;
+                if(D) {
+                    D = pArithDecoder->DECODE(IAx + PREV);
+                    PREV = (PREV << 1) | D;
+                    if(D) {
+                        nNeedBits = 32;
+                        V = 4436;
+                    } else {
+                        nNeedBits = 12;
+                        V = 340;
+                    }
+                } else {
+                    nNeedBits = 8;
+                    V = 84;
+                }
+            } else {
+                nNeedBits = 6;
+                V = 20;
+            }
+        } else {
+            nNeedBits = 4;
+            V = 4;
+        }
+    } else {
+        nNeedBits = 2;
+        V = 0;
+    }
+    nTemp = 0;
+    for(i = 0; i < nNeedBits; i++) {
+        D = pArithDecoder->DECODE(IAx + PREV);
+        if(PREV < 256) {
+            PREV = (PREV << 1) | D;
+        } else {
+            PREV = (((PREV << 1) | D) & 511) | 256;
+        }
+        nTemp = (nTemp << 1) | D;
+    }
+    V += nTemp;
+    if(S == 1 && V > 0) {
+        V = -V;
+    }
+    *nResult = V;
+    if(S == 1 && V == 0) {
+        return JBIG2_OOB;
+    }
+    return 0;
+}
+CJBig2_ArithIaidDecoder::CJBig2_ArithIaidDecoder(unsigned char SBSYMCODELENA)
+{
+    SBSYMCODELEN = SBSYMCODELENA;
+    IAID = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), (1 << SBSYMCODELEN));
+    JBIG2_memset(IAID, 0, sizeof(JBig2ArithCtx) * (int)(1 << SBSYMCODELEN));
+}
+CJBig2_ArithIaidDecoder::~CJBig2_ArithIaidDecoder()
+{
+    m_pModule->JBig2_Free(IAID);
+}
+int CJBig2_ArithIaidDecoder::decode(CJBig2_ArithDecoder *pArithDecoder, int *nResult)
+{
+    int PREV;
+    int D;
+    int i;
+    PREV = 1;
+    for(i = 0; i < SBSYMCODELEN; i++) {
+        D = pArithDecoder->DECODE(IAID + PREV);
+        PREV = (PREV << 1) | D;
+    }
+    PREV = PREV - (1 << SBSYMCODELEN);
+    *nResult = PREV;
+    return 0;
+}