Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/mfbt/Compression.cpp
Line
Count
Source (jump to first uncovered line)
1
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
3
/* This Source Code Form is subject to the terms of the Mozilla Public
4
 * License, v. 2.0. If a copy of the MPL was not distributed with this
5
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6
7
#include "mozilla/Compression.h"
8
#include "mozilla/CheckedInt.h"
9
10
// Without including <string>, MSVC 2015 complains about e.g. the impossibility
11
// to convert `const void* const` to `void*` when calling memchr from
12
// corecrt_memory.h.
13
#include <string>
14
15
#include "lz4.h"
16
17
using namespace mozilla::Compression;
18
19
/* Our wrappers */
20
21
size_t
22
LZ4::compress(const char* aSource, size_t aInputSize, char* aDest)
23
0
{
24
0
  CheckedInt<int> inputSizeChecked = aInputSize;
25
0
  MOZ_ASSERT(inputSizeChecked.isValid());
26
0
  return LZ4_compress_default(aSource, aDest, inputSizeChecked.value(),
27
0
                              LZ4_compressBound(inputSizeChecked.value()));
28
0
}
29
30
size_t
31
LZ4::compressLimitedOutput(const char* aSource, size_t aInputSize, char* aDest,
32
                           size_t aMaxOutputSize)
33
0
{
34
0
  CheckedInt<int> inputSizeChecked = aInputSize;
35
0
  MOZ_ASSERT(inputSizeChecked.isValid());
36
0
  CheckedInt<int> maxOutputSizeChecked = aMaxOutputSize;
37
0
  MOZ_ASSERT(maxOutputSizeChecked.isValid());
38
0
  return LZ4_compress_default(aSource, aDest, inputSizeChecked.value(),
39
0
                              maxOutputSizeChecked.value());
40
0
}
41
42
bool
43
LZ4::decompress(const char* aSource, char* aDest, size_t aOutputSize)
44
0
{
45
0
  CheckedInt<int> outputSizeChecked = aOutputSize;
46
0
  MOZ_ASSERT(outputSizeChecked.isValid());
47
0
  int ret = LZ4_decompress_fast(aSource, aDest, outputSizeChecked.value());
48
0
  return ret >= 0;
49
0
}
50
51
bool
52
LZ4::decompress(const char* aSource, size_t aInputSize, char* aDest,
53
                size_t aMaxOutputSize, size_t* aOutputSize)
54
0
{
55
0
  CheckedInt<int> maxOutputSizeChecked = aMaxOutputSize;
56
0
  MOZ_ASSERT(maxOutputSizeChecked.isValid());
57
0
  CheckedInt<int> inputSizeChecked = aInputSize;
58
0
  MOZ_ASSERT(inputSizeChecked.isValid());
59
0
60
0
  int ret = LZ4_decompress_safe(aSource, aDest, inputSizeChecked.value(),
61
0
                                maxOutputSizeChecked.value());
62
0
  if (ret >= 0) {
63
0
    *aOutputSize = ret;
64
0
    return true;
65
0
  }
66
0
67
0
  *aOutputSize = 0;
68
0
  return false;
69
0
}
70
71
bool
72
LZ4::decompressPartial(const char* aSource, size_t aInputSize, char* aDest,
73
                       size_t aMaxOutputSize, size_t* aOutputSize)
74
0
{
75
0
  CheckedInt<int> maxOutputSizeChecked = aMaxOutputSize;
76
0
  MOZ_ASSERT(maxOutputSizeChecked.isValid());
77
0
  CheckedInt<int> inputSizeChecked = aInputSize;
78
0
  MOZ_ASSERT(inputSizeChecked.isValid());
79
0
80
0
  int ret = LZ4_decompress_safe_partial(aSource, aDest,
81
0
                                        inputSizeChecked.value(),
82
0
                                        maxOutputSizeChecked.value(),
83
0
                                        maxOutputSizeChecked.value());
84
0
  if (ret >= 0) {
85
0
    *aOutputSize = ret;
86
0
    return true;
87
0
  }
88
0
89
0
  *aOutputSize = 0;
90
0
  return false;
91
0
}