Fix CPDF_ICCBasedCS::GetDefaultValue heap-buffer-overflow.
[pdfium.git] / core / src / fpdfapi / fpdf_basic_module.cpp
index 4c648b4..03cfd66 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 "../../include/fxcodec/fx_codec.h"\r
-#include "../../include/fpdfapi/fpdf_module.h"\r
-static CPDF_ModuleMgr* g_FPDFAPI_pDefaultMgr = NULL;\r
-CPDF_ModuleMgr* CPDF_ModuleMgr::Get()\r
-{\r
-    return g_FPDFAPI_pDefaultMgr;\r
-}\r
-void CPDF_ModuleMgr::Create()\r
-{\r
-    g_FPDFAPI_pDefaultMgr = FX_NEW CPDF_ModuleMgr;\r
-    g_FPDFAPI_pDefaultMgr->Initialize();\r
-}\r
-void CPDF_ModuleMgr::Destroy()\r
-{\r
-    if (g_FPDFAPI_pDefaultMgr) {\r
-        delete g_FPDFAPI_pDefaultMgr;\r
-    }\r
-    g_FPDFAPI_pDefaultMgr = NULL;\r
-}\r
-CPDF_ModuleMgr::CPDF_ModuleMgr()\r
-{\r
-    m_pCodecModule = NULL;\r
-    m_pPageModule = NULL;\r
-    m_pRenderModule = NULL;\r
-    m_FileBufSize = 512;\r
-}\r
-void CPDF_ModuleMgr::Initialize()\r
-{\r
-    InitModules();\r
-    m_FileBufSize = 512;\r
-}\r
-void CPDF_ModuleMgr::InitModules()\r
-{\r
-    m_pCodecModule = NULL;\r
-    m_pPageModule = FX_NEW CPDF_PageModuleDef;\r
-    m_pRenderModule = FX_NEW CPDF_RenderModuleDef;\r
-}\r
-CPDF_ModuleMgr::~CPDF_ModuleMgr()\r
-{\r
-    if (m_pPageModule) {\r
-        delete m_pPageModule;\r
-    }\r
-    if (m_pRenderModule) {\r
-        delete m_pRenderModule;\r
-    }\r
-}\r
-void CPDF_ModuleMgr::SetDownloadCallback(FX_BOOL (*callback)(FX_LPCSTR module_name))\r
-{\r
-    m_pDownloadCallback = callback;\r
-}\r
-FX_BOOL CPDF_ModuleMgr::DownloadModule(FX_LPCSTR module_name)\r
-{\r
-    if (m_pDownloadCallback == NULL) {\r
-        return FALSE;\r
-    }\r
-    return m_pDownloadCallback(module_name);\r
-}\r
-static CFX_ByteString _GetPath(const CFX_ByteString& folder, FX_LPCSTR name)\r
-{\r
-    FX_STRSIZE folder_len = folder.GetLength();\r
-#if _FX_OS_ == _FX_SYMBIAN_ || _FXM_PLATFORM_  == _FXM_PLATFORM_WINDOWS_\r
-    if (folder[folder_len - 1] == '\\') {\r
-        return folder + name;\r
-    } else {\r
-        return (folder + "\\") + name;\r
-    }\r
-#else\r
-    if (folder[folder_len - 1] == '/') {\r
-        return folder + name;\r
-    } else {\r
-        return (folder + "/") + name;\r
-    }\r
-#endif\r
-}\r
-void CPDF_ModuleMgr::SetModulePath(FX_LPCSTR module_name, FX_LPCSTR path)\r
-{\r
-    if (module_name == NULL || module_name[0] == 0) {\r
-        m_DefaultModulePath = path;\r
-    } else {\r
-        m_ModulePathList.SetAt(module_name, FX_NEW CFX_ByteString(path, -1));\r
-    }\r
-}\r
-CFX_ByteString CPDF_ModuleMgr::GetModuleFilePath(FX_LPCSTR module_name, FX_LPCSTR name)\r
-{\r
-    CFX_ByteString* pPath = NULL;\r
-    if (m_ModulePathList.Lookup(module_name, (FX_LPVOID&)pPath)) {\r
-        return _GetPath(*pPath, name);\r
-    }\r
-    if (!m_DefaultModulePath.IsEmpty()) {\r
-        return _GetPath(m_DefaultModulePath, name);\r
-    }\r
-#if _FXM_PLATFORM_  == _FXM_PLATFORM_WINDOWS_\r
-    FX_WCHAR app_path[260];\r
-    ::GetModuleFileNameW(NULL, (LPWSTR)app_path, 260);\r
-    FX_INTPTR len = FXSYS_wcslen(app_path);\r
-    for (FX_INTPTR i = len; i >= 0; i --)\r
-        if (app_path[i] == '\\') {\r
-            app_path[i] = 0;\r
-            break;\r
-        }\r
-    CFX_ByteString path = CFX_ByteString::FromUnicode(app_path);\r
-    path += '\\';\r
-    path += name;\r
-    return path;\r
-#else\r
-    return name;\r
-#endif\r
-}\r
-void CPDF_ModuleMgr::NotifyModuleAvailable(FX_LPCSTR module_name)\r
-{\r
-    if (FXSYS_strcmp(module_name, ADDIN_NAME_CJK) == 0) {\r
-        m_pPageModule->NotifyCJKAvailable();\r
-    } else if (FXSYS_strcmp(module_name, ADDIN_NAME_DECODER) == 0) {\r
-        m_pRenderModule->NotifyDecoderAvailable();\r
-    }\r
-}\r
-void CPDF_ModuleMgr::RegisterSecurityHandler(FX_LPCSTR filter, CPDF_SecurityHandler * (*CreateHandler)(void* param), void* param)\r
-{\r
-    if (CreateHandler == NULL) {\r
-        m_SecurityHandlerMap.RemoveKey(filter);\r
-    } else {\r
-        m_SecurityHandlerMap.SetAt(filter, (void*)CreateHandler);\r
-    }\r
-    if (param) {\r
-        m_SecurityHandlerMap.SetAt(FX_BSTRC("_param_") + filter, param);\r
-    }\r
-}\r
-void CPDF_ModuleMgr::SetPrivateData(FX_LPVOID module_id, FX_LPVOID pData, PD_CALLBACK_FREEDATA callback)\r
-{\r
-    m_privateData.SetPrivateData(module_id, pData, callback);\r
-}\r
-FX_LPVOID CPDF_ModuleMgr::GetPrivateData(FX_LPVOID module_id)\r
-{\r
-    return m_privateData.GetPrivateData(module_id);\r
-}\r
-CPDF_SecurityHandler* CPDF_ModuleMgr::CreateSecurityHandler(FX_LPCSTR filter)\r
-{\r
-    CPDF_SecurityHandler* (*CreateHandler)(void*) = NULL;\r
-    if (!m_SecurityHandlerMap.Lookup(filter, (void*&)CreateHandler)) {\r
-        return NULL;\r
-    }\r
-    if (CreateHandler == NULL) {\r
-        return NULL;\r
-    }\r
-    void* param = NULL;\r
-    m_SecurityHandlerMap.Lookup(FX_BSTRC("_param_") + filter, param);\r
-    return CreateHandler(param);\r
-}\r
-ICodec_FaxModule* CPDF_ModuleMgr::GetFaxModule()\r
-{\r
-    return m_pCodecModule ? m_pCodecModule->GetFaxModule() : NULL;\r
-}\r
-ICodec_JpegModule* CPDF_ModuleMgr::GetJpegModule()\r
-{\r
-    return m_pCodecModule ? m_pCodecModule->GetJpegModule() : NULL;\r
-}\r
-ICodec_JpxModule* CPDF_ModuleMgr::GetJpxModule()\r
-{\r
-    return m_pCodecModule ? m_pCodecModule->GetJpxModule() : NULL;\r
-}\r
-ICodec_Jbig2Module* CPDF_ModuleMgr::GetJbig2Module()\r
-{\r
-    return m_pCodecModule ? m_pCodecModule->GetJbig2Module() : NULL;\r
-}\r
-ICodec_IccModule* CPDF_ModuleMgr::GetIccModule()\r
-{\r
-    return m_pCodecModule ? m_pCodecModule->GetIccModule() : NULL;\r
-}\r
-ICodec_FlateModule* CPDF_ModuleMgr::GetFlateModule()\r
-{\r
-    return m_pCodecModule ? m_pCodecModule->GetFlateModule() : NULL;\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 "../../include/fxcodec/fx_codec.h"
+#include "../../include/fpdfapi/fpdf_module.h"
+
+namespace {
+
+CPDF_ModuleMgr* g_FPDFAPI_pDefaultMgr = nullptr;
+
+const char kAddinNameCJK[] = "Eastern Asian Language Support";
+
+}  // namespace
+
+// static
+CPDF_ModuleMgr* CPDF_ModuleMgr::Get()
+{
+    return g_FPDFAPI_pDefaultMgr;
+}
+
+// static
+void CPDF_ModuleMgr::Create()
+{
+    ASSERT(!g_FPDFAPI_pDefaultMgr);
+    g_FPDFAPI_pDefaultMgr = new CPDF_ModuleMgr;
+}
+
+// static
+void CPDF_ModuleMgr::Destroy()
+{
+    delete g_FPDFAPI_pDefaultMgr;
+    g_FPDFAPI_pDefaultMgr = nullptr;
+}
+
+CPDF_ModuleMgr::CPDF_ModuleMgr()
+    : m_pCodecModule(nullptr)
+{
+}
+
+CPDF_ModuleMgr::~CPDF_ModuleMgr()
+{
+}
+
+void CPDF_ModuleMgr::SetDownloadCallback(FX_BOOL (*callback)(const FX_CHAR* module_name))
+{
+    m_pDownloadCallback = callback;
+}
+FX_BOOL CPDF_ModuleMgr::DownloadModule(const FX_CHAR* module_name)
+{
+    if (m_pDownloadCallback == NULL) {
+        return FALSE;
+    }
+    return m_pDownloadCallback(module_name);
+}
+void CPDF_ModuleMgr::NotifyModuleAvailable(const FX_CHAR* module_name)
+{
+    if (FXSYS_strcmp(module_name, kAddinNameCJK) == 0) {
+        m_pPageModule->NotifyCJKAvailable();
+    }
+}
+void CPDF_ModuleMgr::RegisterSecurityHandler(const FX_CHAR* filter, CPDF_SecurityHandler * (*CreateHandler)(void* param), void* param)
+{
+    if (CreateHandler == NULL) {
+        m_SecurityHandlerMap.RemoveKey(filter);
+    } else {
+        m_SecurityHandlerMap.SetAt(filter, (void*)CreateHandler);
+    }
+    if (param) {
+        m_SecurityHandlerMap.SetAt(FX_BSTRC("_param_") + filter, param);
+    }
+}
+void CPDF_ModuleMgr::SetPrivateData(void* module_id, void* pData, PD_CALLBACK_FREEDATA callback)
+{
+    m_privateData.SetPrivateData(module_id, pData, callback);
+}
+void* CPDF_ModuleMgr::GetPrivateData(void* module_id)
+{
+    return m_privateData.GetPrivateData(module_id);
+}
+CPDF_SecurityHandler* CPDF_ModuleMgr::CreateSecurityHandler(const FX_CHAR* filter)
+{
+    CPDF_SecurityHandler* (*CreateHandler)(void*) = NULL;
+    if (!m_SecurityHandlerMap.Lookup(filter, (void*&)CreateHandler)) {
+        return NULL;
+    }
+    if (CreateHandler == NULL) {
+        return NULL;
+    }
+    void* param = NULL;
+    m_SecurityHandlerMap.Lookup(FX_BSTRC("_param_") + filter, param);
+    return CreateHandler(param);
+}
+ICodec_FaxModule* CPDF_ModuleMgr::GetFaxModule()
+{
+    return m_pCodecModule ? m_pCodecModule->GetFaxModule() : NULL;
+}
+ICodec_JpegModule* CPDF_ModuleMgr::GetJpegModule()
+{
+    return m_pCodecModule ? m_pCodecModule->GetJpegModule() : NULL;
+}
+ICodec_JpxModule* CPDF_ModuleMgr::GetJpxModule()
+{
+    return m_pCodecModule ? m_pCodecModule->GetJpxModule() : NULL;
+}
+ICodec_Jbig2Module* CPDF_ModuleMgr::GetJbig2Module()
+{
+    return m_pCodecModule ? m_pCodecModule->GetJbig2Module() : NULL;
+}
+ICodec_IccModule* CPDF_ModuleMgr::GetIccModule()
+{
+    return m_pCodecModule ? m_pCodecModule->GetIccModule() : NULL;
+}
+ICodec_FlateModule* CPDF_ModuleMgr::GetFlateModule()
+{
+    return m_pCodecModule ? m_pCodecModule->GetFlateModule() : NULL;
+}