Home | History | Annotate | Download | only in fxcrt
      1 // Copyright 2015 PDFium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "core/fxcrt/fx_memory.h"
      6 
      7 #include <limits>
      8 
      9 #include "testing/gtest/include/gtest/gtest.h"
     10 
     11 namespace {
     12 
     13 const size_t kMaxByteAlloc = std::numeric_limits<size_t>::max();
     14 const size_t kMaxIntAlloc = kMaxByteAlloc / sizeof(int);
     15 const size_t kOverflowIntAlloc = kMaxIntAlloc + 100;
     16 const size_t kWidth = 640;
     17 const size_t kOverflowIntAlloc2D = kMaxIntAlloc / kWidth + 10;
     18 
     19 }  // namespace
     20 
     21 // TODO(tsepez): re-enable OOM tests if we can find a way to
     22 // prevent it from hosing the bots.
     23 TEST(fxcrt, DISABLED_FX_AllocOOM) {
     24   EXPECT_DEATH_IF_SUPPORTED((void)FX_Alloc(int, kMaxIntAlloc), "");
     25 
     26   int* ptr = FX_Alloc(int, 1);
     27   EXPECT_TRUE(ptr);
     28   EXPECT_DEATH_IF_SUPPORTED((void)FX_Realloc(int, ptr, kMaxIntAlloc), "");
     29   FX_Free(ptr);
     30 }
     31 
     32 TEST(fxcrt, FX_AllocOverflow) {
     33   // |ptr| needs to be defined and used to avoid Clang optimizes away the
     34   // FX_Alloc() statement overzealously for optimized builds.
     35   int* ptr = nullptr;
     36   EXPECT_DEATH_IF_SUPPORTED(ptr = FX_Alloc(int, kOverflowIntAlloc), "") << ptr;
     37 
     38   ptr = FX_Alloc(int, 1);
     39   EXPECT_TRUE(ptr);
     40   EXPECT_DEATH_IF_SUPPORTED((void)FX_Realloc(int, ptr, kOverflowIntAlloc), "");
     41   FX_Free(ptr);
     42 }
     43 
     44 TEST(fxcrt, FX_AllocOverflow2D) {
     45   // |ptr| needs to be defined and used to avoid Clang optimizes away the
     46   // FX_Alloc() statement overzealously for optimized builds.
     47   int* ptr = nullptr;
     48   EXPECT_DEATH_IF_SUPPORTED(ptr = FX_Alloc2D(int, kWidth, kOverflowIntAlloc2D),
     49                             "")
     50       << ptr;
     51 }
     52 
     53 TEST(fxcrt, DISABLED_FX_TryAllocOOM) {
     54   EXPECT_FALSE(FX_TryAlloc(int, kMaxIntAlloc));
     55 
     56   int* ptr = FX_Alloc(int, 1);
     57   EXPECT_TRUE(ptr);
     58   EXPECT_FALSE(FX_TryRealloc(int, ptr, kMaxIntAlloc));
     59   FX_Free(ptr);
     60 }
     61 
     62 TEST(fxcrt, FX_TryAllocOverflow) {
     63   // |ptr| needs to be defined and used to avoid Clang optimizes away the
     64   // calloc() statement overzealously for optimized builds.
     65   int* ptr = (int*)calloc(sizeof(int), kOverflowIntAlloc);
     66   EXPECT_FALSE(ptr) << ptr;
     67 
     68   ptr = FX_Alloc(int, 1);
     69   EXPECT_TRUE(ptr);
     70   EXPECT_FALSE(FX_TryRealloc(int, ptr, kOverflowIntAlloc));
     71   FX_Free(ptr);
     72 }
     73 
     74 TEST(fxcrt, DISABLED_FXMEM_DefaultOOM) {
     75   EXPECT_FALSE(FXMEM_DefaultAlloc(kMaxByteAlloc));
     76 
     77   void* ptr = FXMEM_DefaultAlloc(1);
     78   EXPECT_TRUE(ptr);
     79   EXPECT_FALSE(FXMEM_DefaultRealloc(ptr, kMaxByteAlloc));
     80   FXMEM_DefaultFree(ptr);
     81 }
     82