Tue, 06 Jan 2015 21:39:09 +0100
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 }