mfbt/Compression.cpp

Tue, 06 Jan 2015 21:39:09 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Tue, 06 Jan 2015 21:39:09 +0100
branch
TOR_BUG_9701
changeset 8
97036ab72558
permissions
-rw-r--r--

Conditionally force memory storage according to privacy.thirdparty.isolate;
This solves Tor bug #9701, complying with disk avoidance documented in
https://www.torproject.org/projects/torbrowser/design/#disk-avoidance.

     1 /* This Source Code Form is subject to the terms of the Mozilla Public
     2  * License, v. 2.0. If a copy of the MPL was not distributed with this
     3  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     5 #include "mozilla/Compression.h"
     6 #include "mozilla/CheckedInt.h"
     7 using namespace mozilla::Compression;
     9 namespace {
    11 #include "lz4.c"
    13 }/* anonymous namespace */
    15 /* Our wrappers */
    17 size_t
    18 LZ4::compress(const char* source, size_t inputSize, char* dest)
    19 {
    20     CheckedInt<int> inputSizeChecked = inputSize;
    21     MOZ_ASSERT(inputSizeChecked.isValid());
    22     return LZ4_compress(source, dest, inputSizeChecked.value());
    23 }
    25 size_t
    26 LZ4::compressLimitedOutput(const char* source, size_t inputSize, char* dest, size_t maxOutputSize)
    27 {
    28     CheckedInt<int> inputSizeChecked = inputSize;
    29     MOZ_ASSERT(inputSizeChecked.isValid());
    30     CheckedInt<int> maxOutputSizeChecked = maxOutputSize;
    31     MOZ_ASSERT(maxOutputSizeChecked.isValid());
    32     return LZ4_compress_limitedOutput(source, dest, inputSizeChecked.value(),
    33                                       maxOutputSizeChecked.value());
    34 }
    36 bool
    37 LZ4::decompress(const char* source, char* dest, size_t outputSize)
    38 {
    39     CheckedInt<int> outputSizeChecked = outputSize;
    40     MOZ_ASSERT(outputSizeChecked.isValid());
    41     int ret = LZ4_decompress_fast(source, dest, outputSizeChecked.value());
    42     return ret >= 0;
    43 }
    45 bool
    46 LZ4::decompress(const char* source, size_t inputSize, char* dest, size_t maxOutputSize,
    47                 size_t *outputSize)
    48 {
    49     CheckedInt<int> maxOutputSizeChecked = maxOutputSize;
    50     MOZ_ASSERT(maxOutputSizeChecked.isValid());
    51     CheckedInt<int> inputSizeChecked = inputSize;
    52     MOZ_ASSERT(inputSizeChecked.isValid());
    54     int ret = LZ4_decompress_safe(source, dest, inputSizeChecked.value(),
    55                                   maxOutputSizeChecked.value());
    56     if (ret >= 0) {
    57         *outputSize = ret;
    58         return true;
    59     } else {
    60         *outputSize = 0;
    61         return false;
    62     }
    63 }

mercurial