other-licenses/7zstub/src/7zip/Common/InBuffer.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 // InBuffer.cpp
     3 #include "StdAfx.h"
     5 #include "InBuffer.h"
     7 #include "../../Common/Alloc.h"
     9 CInBuffer::CInBuffer(): 
    10   _buffer(0), 
    11   _bufferLimit(0), 
    12   _bufferBase(0), 
    13   _stream(0),
    14   _bufferSize(0)
    15 {}
    17 bool CInBuffer::Create(UInt32 bufferSize)
    18 {
    19   const UInt32 kMinBlockSize = 1;
    20   if (bufferSize < kMinBlockSize)
    21     bufferSize = kMinBlockSize;
    22   if (_bufferBase != 0 && _bufferSize == bufferSize)
    23     return true;
    24   Free();
    25   _bufferSize = bufferSize;
    26   _bufferBase = (Byte *)::MidAlloc(bufferSize);
    27   return (_bufferBase != 0);
    28 }
    30 void CInBuffer::Free()
    31 {
    32   ::MidFree(_bufferBase);
    33   _bufferBase = 0;
    34 }
    36 void CInBuffer::SetStream(ISequentialInStream *stream)
    37 {
    38   _stream = stream;
    39 }
    41 void CInBuffer::Init()
    42 {
    43   _processedSize = 0;
    44   _buffer = _bufferBase;
    45   _bufferLimit = _buffer;
    46   _wasFinished = false;
    47   #ifdef _NO_EXCEPTIONS
    48   ErrorCode = S_OK;
    49   #endif
    50 }
    52 bool CInBuffer::ReadBlock()
    53 {
    54   #ifdef _NO_EXCEPTIONS
    55   if (ErrorCode != S_OK)
    56     return false;
    57   #endif
    58   if (_wasFinished)
    59     return false;
    60   _processedSize += (_buffer - _bufferBase);
    61   UInt32 numProcessedBytes;
    62   HRESULT result = _stream->Read(_bufferBase, _bufferSize, &numProcessedBytes);
    63   #ifdef _NO_EXCEPTIONS
    64   ErrorCode = result;
    65   #else
    66   if (result != S_OK)
    67     throw CInBufferException(result);
    68   #endif
    69   _buffer = _bufferBase;
    70   _bufferLimit = _buffer + numProcessedBytes;
    71   _wasFinished = (numProcessedBytes == 0);
    72   return (!_wasFinished);
    73 }
    75 Byte CInBuffer::ReadBlock2()
    76 {
    77   if(!ReadBlock())
    78     return 0xFF;
    79   return *_buffer++;
    80 }

mercurial