diff --git a/third_party/libopenjpeg/opj_malloc.cc b/third_party/libopenjpeg/opj_malloc.cc
new file mode 100644
--- /dev/null
+++ b/third_party/libopenjpeg/opj_malloc.cc
@@ -0,0 +1,41 @@
+// Copyright 2020 The PDFium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Deliberately not including opj_malloc.h, which has poisoned malloc and
+// friends.
+
+#include "core/fxcrt/fx_memory.h"
+
+extern "C" {
+
+void* opj_malloc(size_t size) {
+  return FXMEM_DefaultAlloc(size);
+}
+
+void* opj_calloc(size_t numOfElements, size_t sizeOfElements) {
+  return FXMEM_DefaultCalloc(numOfElements, sizeOfElements);
+}
+
+void* opj_aligned_malloc(size_t size) {
+  return size ? FX_AlignedAlloc(size, 16) : nullptr;
+}
+
+void opj_aligned_free(void* ptr) {
+  FX_AlignedFree(ptr);
+}
+
+void* opj_aligned_32_malloc(size_t size) {
+  return size ? FX_AlignedAlloc(size, 32) : nullptr;
+}
+
+void* opj_realloc(void* m, size_t s) {
+  return FXMEM_DefaultRealloc(m, s);
+}
+
+void opj_free(void* m) {
+  if (m)
+    FXMEM_DefaultFree(m);
+}
+
+}  // extern "C"
diff --git a/third_party/libopenjpeg/opj_malloc.h b/third_party/libopenjpeg/opj_malloc.h
--- a/third_party/libopenjpeg/opj_malloc.h
+++ b/third_party/libopenjpeg/opj_malloc.h
@@ -33,6 +33,11 @@
 #define OPJ_MALLOC_H
 
 #include <stddef.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 /**
 @file opj_malloc.h
 @brief Internal functions
@@ -68,7 +73,6 @@ Allocate memory aligned to a 16 byte bou
 @return Returns a void pointer to the allocated space, or NULL if there is insufficient memory available
 */
 void * opj_aligned_malloc(size_t size);
-void * opj_aligned_realloc(void *ptr, size_t size);
 void opj_aligned_free(void* ptr);
 
 /**
@@ -77,7 +81,6 @@ Allocate memory aligned to a 32 byte bou
 @return Returns a void pointer to the allocated space, or NULL if there is insufficient memory available
 */
 void * opj_aligned_32_malloc(size_t size);
-void * opj_aligned_32_realloc(void *ptr, size_t size);
 
 /**
 Reallocate memory blocks.
@@ -102,5 +105,8 @@ void opj_free(void * m);
 
 /*@}*/
 
-#endif /* OPJ_MALLOC_H */
+#ifdef __cplusplus
+}  // extern "C"
+#endif
 
+#endif /* OPJ_MALLOC_H */
