other-licenses/7zstub/src/7zip/Archive/Common/CoderMixer2.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 // CoderMixer2.cpp
     3 #include "StdAfx.h"
     5 #include "CoderMixer2.h"
     7 namespace NCoderMixer2 {
     9 CBindReverseConverter::CBindReverseConverter(const CBindInfo &srcBindInfo):
    10   _srcBindInfo(srcBindInfo)
    11 {
    12   srcBindInfo.GetNumStreams(NumSrcInStreams, _numSrcOutStreams);
    14   UInt32  j;
    15   for (j = 0; j < NumSrcInStreams; j++)
    16   {
    17     _srcInToDestOutMap.Add(0);
    18     DestOutToSrcInMap.Add(0);
    19   }
    20   for (j = 0; j < _numSrcOutStreams; j++)
    21   {
    22     _srcOutToDestInMap.Add(0);
    23     _destInToSrcOutMap.Add(0);
    24   }
    26   UInt32 destInOffset = 0;
    27   UInt32 destOutOffset = 0;
    28   UInt32 srcInOffset = NumSrcInStreams;
    29   UInt32 srcOutOffset = _numSrcOutStreams;
    31   for (int i = srcBindInfo.Coders.Size() - 1; i >= 0; i--)
    32   {
    33     const CCoderStreamsInfo &srcCoderInfo = srcBindInfo.Coders[i];
    35     srcInOffset -= srcCoderInfo.NumInStreams;
    36     srcOutOffset -= srcCoderInfo.NumOutStreams;
    38     UInt32 j;
    39     for (j = 0; j < srcCoderInfo.NumInStreams; j++, destOutOffset++)
    40     {
    41       UInt32 index = srcInOffset + j;
    42       _srcInToDestOutMap[index] = destOutOffset;
    43       DestOutToSrcInMap[destOutOffset] = index;
    44     }
    45     for (j = 0; j < srcCoderInfo.NumOutStreams; j++, destInOffset++)
    46     {
    47       UInt32 index = srcOutOffset + j;
    48       _srcOutToDestInMap[index] = destInOffset;
    49       _destInToSrcOutMap[destInOffset] = index;
    50     }
    51   }
    52 }
    54 void CBindReverseConverter::CreateReverseBindInfo(CBindInfo &destBindInfo)
    55 {
    56   destBindInfo.Coders.Clear();
    57   destBindInfo.BindPairs.Clear();
    58   destBindInfo.InStreams.Clear();
    59   destBindInfo.OutStreams.Clear();
    61   int i;
    62   for (i = _srcBindInfo.Coders.Size() - 1; i >= 0; i--)
    63   {
    64     const CCoderStreamsInfo &srcCoderInfo = _srcBindInfo.Coders[i];
    65     CCoderStreamsInfo destCoderInfo;
    66     destCoderInfo.NumInStreams = srcCoderInfo.NumOutStreams;
    67     destCoderInfo.NumOutStreams = srcCoderInfo.NumInStreams;
    68     destBindInfo.Coders.Add(destCoderInfo);
    69   }
    70   for (i = _srcBindInfo.BindPairs.Size() - 1; i >= 0; i--)
    71   {
    72     const CBindPair &srcBindPair = _srcBindInfo.BindPairs[i];
    73     CBindPair destBindPair;
    74     destBindPair.InIndex = _srcOutToDestInMap[srcBindPair.OutIndex];
    75     destBindPair.OutIndex = _srcInToDestOutMap[srcBindPair.InIndex];
    76     destBindInfo.BindPairs.Add(destBindPair);
    77   }
    78   for (i = 0; i < _srcBindInfo.InStreams.Size(); i++)
    79     destBindInfo.OutStreams.Add(_srcInToDestOutMap[_srcBindInfo.InStreams[i]]);
    80   for (i = 0; i < _srcBindInfo.OutStreams.Size(); i++)
    81     destBindInfo.InStreams.Add(_srcOutToDestInMap[_srcBindInfo.OutStreams[i]]);
    82 }
    84 CCoderInfo::CCoderInfo(UInt32 numInStreams, UInt32 numOutStreams): 
    85     NumInStreams(numInStreams),
    86     NumOutStreams(numOutStreams)
    87 {
    88   InSizes.Reserve(NumInStreams);
    89   InSizePointers.Reserve(NumInStreams);
    90   OutSizePointers.Reserve(NumOutStreams);
    91   OutSizePointers.Reserve(NumOutStreams);
    92 }
    94 static void SetSizes(const UInt64 **srcSizes, CRecordVector<UInt64> &sizes, 
    95     CRecordVector<const UInt64 *> &sizePointers, UInt32 numItems)
    96 {
    97   sizes.Clear();
    98   sizePointers.Clear();
    99   for(UInt32 i = 0; i < numItems; i++)
   100   {
   101     if (srcSizes == 0 || srcSizes[i] == NULL)
   102     {
   103       sizes.Add(0);
   104       sizePointers.Add(NULL);
   105     }
   106     else
   107     {
   108       sizes.Add(*srcSizes[i]);
   109       sizePointers.Add(&sizes.Back());
   110     }
   111   }
   112 }
   114 void CCoderInfo::SetCoderInfo(const UInt64 **inSizes,
   115       const UInt64 **outSizes)
   116 {
   117   SetSizes(inSizes, InSizes, InSizePointers, NumInStreams);
   118   SetSizes(outSizes, OutSizes, OutSizePointers, NumOutStreams);
   119 }
   121 }  

mercurial