Coverage Report

Created: 2018-09-25 14:53

/work/obj-fuzz/dist/include/mozilla/Compression.h
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
/* Various simple compression/decompression functions. */
8
9
#ifndef mozilla_Compression_h_
10
#define mozilla_Compression_h_
11
12
#include "mozilla/Assertions.h"
13
#include "mozilla/Types.h"
14
15
namespace mozilla {
16
namespace Compression {
17
18
/**
19
 * LZ4 is a very fast byte-wise compression algorithm.
20
 *
21
 * Compared to Google's Snappy it is faster to compress and decompress and
22
 * generally produces output of about the same size.
23
 *
24
 * Compared to zlib it compresses at about 10x the speed, decompresses at about
25
 * 4x the speed and produces output of about 1.5x the size.
26
 */
27
28
class LZ4
29
{
30
public:
31
  /**
32
   * Compresses |aInputSize| bytes from |aSource| into |aDest|. Destination
33
   * buffer must be already allocated, and must be sized to handle worst cases
34
   * situations (input data not compressible). Worst case size evaluation is
35
   * provided by function maxCompressedSize()
36
   *
37
   * @param aInputSize is the input size. Max supported value is ~1.9GB
38
   * @return the number of bytes written in buffer |aDest|
39
   */
40
  static MFBT_API size_t
41
  compress(const char* aSource, size_t aInputSize, char* aDest);
42
43
  /**
44
   * Compress |aInputSize| bytes from |aSource| into an output buffer
45
   * |aDest| of maximum size |aMaxOutputSize|.  If it cannot achieve it,
46
   * compression will stop, and result of the function will be zero,
47
   * |aDest| will still be written to, but since the number of input
48
   * bytes consumed is not returned the result is not usable.
49
   *
50
   * This function never writes outside of provided output buffer.
51
   *
52
   * @param aInputSize is the input size. Max supported value is ~1.9GB
53
   * @param aMaxOutputSize is the size of the destination buffer (which must
54
   *   be already allocated)
55
   * @return the number of bytes written in buffer |aDest| or 0 if the
56
   *   compression fails
57
   */
58
  static MFBT_API size_t
59
  compressLimitedOutput(const char* aSource, size_t aInputSize, char* aDest,
60
                        size_t aMaxOutputSize);
61
62
  /**
63
   * If the source stream is malformed, the function will stop decoding
64
   * and return false.
65
   *
66
   * This function never writes outside of provided buffers, and never
67
   * modifies input buffer.
68
   *
69
   * Note: destination buffer must be already allocated, and its size must be a
70
   *       minimum of |aOutputSize| bytes.
71
   *
72
   * @param aOutputSize is the output size, therefore the original size
73
   * @return true on success, false on failure
74
   */
75
  static MFBT_API MOZ_MUST_USE bool
76
  decompress(const char* aSource, char* aDest, size_t aOutputSize);
77
78
  /**
79
   * If the source stream is malformed, the function will stop decoding
80
   * and return false.
81
   *
82
   * This function never writes beyond aDest + aMaxOutputSize, and is
83
   * therefore protected against malicious data packets.
84
   *
85
   * Note: Destination buffer must be already allocated.  This version is
86
   *       slightly slower than the decompress without the aMaxOutputSize.
87
   *
88
   * @param aInputSize is the length of the input compressed data
89
   * @param aMaxOutputSize is the size of the destination buffer (which must be
90
   *   already allocated)
91
   * @param aOutputSize the actual number of bytes decoded in the destination
92
   *   buffer (necessarily <= aMaxOutputSize)
93
   * @return true on success, false on failure
94
   */
95
  static MFBT_API MOZ_MUST_USE bool
96
  decompress(const char* aSource, size_t aInputSize, char* aDest,
97
             size_t aMaxOutputSize, size_t* aOutputSize);
98
99
  /**
100
   * If the source stream is malformed, the function will stop decoding
101
   * and return false.
102
   *
103
   * This function never writes beyond aDest + aMaxOutputSize, and is
104
   * therefore protected against malicious data packets. It also ignores
105
   * unconsumed input upon reaching aMaxOutputSize and can therefore be used
106
   * for partial decompression.
107
   *
108
   * Note: Destination buffer must be already allocated.  This version is
109
   *       slightly slower than the decompress without the aMaxOutputSize.
110
   *
111
   * @param aInputSize is the length of the input compressed data
112
   * @param aMaxOutputSize is the size of the destination buffer (which must be
113
   *   already allocated)
114
   * @param aOutputSize the actual number of bytes decoded in the destination
115
   *   buffer (necessarily <= aMaxOutputSize)
116
   * @return true on success, false on failure
117
   */
118
  static MFBT_API MOZ_MUST_USE bool
119
  decompressPartial(const char* aSource, size_t aInputSize, char* aDest,
120
                    size_t aMaxOutputSize, size_t* aOutputSize);
121
122
  /*
123
   * Provides the maximum size that LZ4 may output in a "worst case"
124
   * scenario (input data not compressible) primarily useful for memory
125
   * allocation of output buffer.
126
   * note : this function is limited by "int" range (2^31-1)
127
   *
128
   * @param aInputSize is the input size. Max supported value is ~1.9GB
129
   * @return maximum output size in a "worst case" scenario
130
   */
131
  static inline size_t maxCompressedSize(size_t aInputSize)
132
0
  {
133
0
    size_t max = (aInputSize + (aInputSize / 255) + 16);
134
0
    MOZ_ASSERT(max > aInputSize);
135
0
    return max;
136
0
  }
Unexecuted instantiation: mozilla::Compression::LZ4::maxCompressedSize(unsigned long)
Unexecuted instantiation: mozilla::Compression::LZ4::maxCompressedSize(unsigned long)
137
};
138
139
} /* namespace Compression */
140
} /* namespace mozilla */
141
142
#endif /* mozilla_Compression_h_ */