~ubuntu-branches/ubuntu/trusty/unrar-nonfree/trusty-security

1 by Chris Anderson
Import upstream version 3.3.6
1
#include "rar.hpp"
2
3
RawRead::RawRead(File *SrcFile)
4
{
5
  RawRead::SrcFile=SrcFile;
1.2.14 by Martin Meredith
Import upstream version 5.0.10
6
  Reset();
7
}
8
9
10
void RawRead::Reset()
11
{
12
  Data.SoftReset();
1 by Chris Anderson
Import upstream version 3.3.6
13
  ReadPos=0;
14
  DataSize=0;
15
#ifndef SHELL_EXT
16
  Crypt=NULL;
17
#endif
18
}
19
20
1.2.14 by Martin Meredith
Import upstream version 5.0.10
21
size_t RawRead::Read(size_t Size)
1 by Chris Anderson
Import upstream version 3.3.6
22
{
1.2.14 by Martin Meredith
Import upstream version 5.0.10
23
  size_t ReadSize=0;
1.2.12 by Martin Meredith
Import upstream version 4.1.4
24
#if !defined(SHELL_EXT) && !defined(RAR_NOCRYPT)
1 by Chris Anderson
Import upstream version 3.3.6
25
  if (Crypt!=NULL)
26
  {
1.2.14 by Martin Meredith
Import upstream version 5.0.10
27
    // Full size of buffer with already read data including data read 
28
    // for encryption block alignment.
29
    size_t FullSize=Data.Size();
30
31
    // Data read for alignment and not processed yet.
32
    size_t DataLeft=FullSize-DataSize;
33
34
    if (Size>DataLeft) // Need to read more than we already have.
1 by Chris Anderson
Import upstream version 3.3.6
35
    {
1.2.14 by Martin Meredith
Import upstream version 5.0.10
36
      size_t SizeToRead=Size-DataLeft;
37
      size_t AlignedReadSize=SizeToRead+((~SizeToRead+1) & CRYPT_BLOCK_MASK);
1 by Chris Anderson
Import upstream version 3.3.6
38
      Data.Add(AlignedReadSize);
1.2.14 by Martin Meredith
Import upstream version 5.0.10
39
      ReadSize=SrcFile->Read(&Data[FullSize],AlignedReadSize);
40
      Crypt->DecryptBlock(&Data[FullSize],AlignedReadSize);
1 by Chris Anderson
Import upstream version 3.3.6
41
      DataSize+=ReadSize==0 ? 0:Size;
42
    }
1.2.14 by Martin Meredith
Import upstream version 5.0.10
43
    else // Use buffered data, no real read.
44
    {
45
      ReadSize=Size;
1 by Chris Anderson
Import upstream version 3.3.6
46
      DataSize+=Size;
1.2.14 by Martin Meredith
Import upstream version 5.0.10
47
    }
1 by Chris Anderson
Import upstream version 3.3.6
48
  }
49
  else
50
#endif
51
    if (Size!=0)
52
    {
53
      Data.Add(Size);
1.2.14 by Martin Meredith
Import upstream version 5.0.10
54
      ReadSize=SrcFile->Read(&Data[DataSize],Size);
55
      DataSize+=ReadSize;
1 by Chris Anderson
Import upstream version 3.3.6
56
    }
1.2.14 by Martin Meredith
Import upstream version 5.0.10
57
  return ReadSize;
1 by Chris Anderson
Import upstream version 3.3.6
58
}
59
60
1.2.4 by Martin Meredith
Import upstream version 3.9.3
61
void RawRead::Read(byte *SrcData,size_t Size)
1 by Chris Anderson
Import upstream version 3.3.6
62
{
63
  if (Size!=0)
64
  {
65
    Data.Add(Size);
66
    memcpy(&Data[DataSize],SrcData,Size);
67
    DataSize+=Size;
68
  }
69
}
70
71
1.2.14 by Martin Meredith
Import upstream version 5.0.10
72
byte RawRead::Get1()
1 by Chris Anderson
Import upstream version 3.3.6
73
{
1.2.14 by Martin Meredith
Import upstream version 5.0.10
74
  return ReadPos<DataSize ? Data[ReadPos++]:0;
1 by Chris Anderson
Import upstream version 3.3.6
75
}
76
77
1.2.14 by Martin Meredith
Import upstream version 5.0.10
78
ushort RawRead::Get2()
1 by Chris Anderson
Import upstream version 3.3.6
79
{
1.1.5 by Martin Meredith
Import upstream version 3.7.2
80
  if (ReadPos+1<DataSize)
81
  {
1.2.14 by Martin Meredith
Import upstream version 5.0.10
82
    ushort Result=Data[ReadPos]+(Data[ReadPos+1]<<8);
1.1.5 by Martin Meredith
Import upstream version 3.7.2
83
    ReadPos+=2;
1.2.14 by Martin Meredith
Import upstream version 5.0.10
84
    return Result;
1.1.5 by Martin Meredith
Import upstream version 3.7.2
85
  }
1.2.14 by Martin Meredith
Import upstream version 5.0.10
86
  return 0;
1 by Chris Anderson
Import upstream version 3.3.6
87
}
88
89
1.2.14 by Martin Meredith
Import upstream version 5.0.10
90
uint RawRead::Get4()
1 by Chris Anderson
Import upstream version 3.3.6
91
{
1.1.5 by Martin Meredith
Import upstream version 3.7.2
92
  if (ReadPos+3<DataSize)
93
  {
1.2.14 by Martin Meredith
Import upstream version 5.0.10
94
    uint Result=Data[ReadPos]+(Data[ReadPos+1]<<8)+(Data[ReadPos+2]<<16)+
95
                (Data[ReadPos+3]<<24);
1.1.5 by Martin Meredith
Import upstream version 3.7.2
96
    ReadPos+=4;
1.2.14 by Martin Meredith
Import upstream version 5.0.10
97
    return Result;
1.1.5 by Martin Meredith
Import upstream version 3.7.2
98
  }
1.2.14 by Martin Meredith
Import upstream version 5.0.10
99
  return 0;
100
}
101
102
103
uint64 RawRead::Get8()
104
{
105
  uint Low=Get4(),High=Get4();
106
  return INT32TO64(High,Low);
107
}
108
109
110
uint64 RawRead::GetV()
111
{
112
  uint64 Result=0;
113
  for (uint Shift=0;ReadPos<DataSize;Shift+=7)
1.1.5 by Martin Meredith
Import upstream version 3.7.2
114
  {
1.2.14 by Martin Meredith
Import upstream version 5.0.10
115
    byte CurByte=Data[ReadPos++];
116
    Result+=uint64(CurByte & 0x7f)<<Shift;
117
    if ((CurByte & 0x80)==0)
118
      return Result; // Decoded successfully.
1.1.5 by Martin Meredith
Import upstream version 3.7.2
119
  }
1.2.14 by Martin Meredith
Import upstream version 5.0.10
120
  return 0; // Out of buffer border.
121
}
122
123
124
// Return a number of bytes in current variable length integer.
125
uint RawRead::GetVSize(size_t Pos)
126
{
127
  for (size_t CurPos=Pos;CurPos<DataSize;CurPos++)
128
    if ((Data[CurPos] & 0x80)==0)
129
      return int(CurPos-Pos+1);
130
  return 0; // Buffer overflow.
131
}
132
133
134
size_t RawRead::GetB(void *Field,size_t Size)
135
{
136
  byte *F=(byte *)Field;
137
  size_t CopySize=Min(DataSize-ReadPos,Size);
138
  if (CopySize>0)
139
    memcpy(F,&Data[ReadPos],CopySize);
140
  if (Size>CopySize)
141
    memset(F+CopySize,0,Size-CopySize);
142
  ReadPos+=CopySize;
143
  return CopySize;
144
}
145
146
147
void RawRead::GetW(wchar *Field,size_t Size)
1 by Chris Anderson
Import upstream version 3.3.6
148
{
1.1.5 by Martin Meredith
Import upstream version 3.7.2
149
  if (ReadPos+2*Size-1<DataSize)
150
  {
151
    RawToWide(&Data[ReadPos],Field,Size);
1.2.10 by Martin Meredith
Import upstream version 4.0.2
152
    ReadPos+=sizeof(wchar)*Size;
1.1.5 by Martin Meredith
Import upstream version 3.7.2
153
  }
154
  else
1.2.10 by Martin Meredith
Import upstream version 4.0.2
155
    memset(Field,0,sizeof(wchar)*Size);
1 by Chris Anderson
Import upstream version 3.3.6
156
}
157
158
1.2.14 by Martin Meredith
Import upstream version 5.0.10
159
uint RawRead::GetCRC15(bool ProcessedOnly) // RAR 1.5 block CRC.
160
{
161
  if (DataSize<=2)
162
    return 0;
163
  uint HeaderCRC=CRC32(0xffffffff,&Data[2],(ProcessedOnly ? ReadPos:DataSize)-2);
164
  return ~HeaderCRC & 0xffff;
165
}
166
167
168
uint RawRead::GetCRC50() // RAR 5.0 block CRC.
169
{
170
  if (DataSize<=4)
171
    return 0xffffffff;
172
  return CRC32(0xffffffff,&Data[4],DataSize-4) ^ 0xffffffff;
173
}
174
175
176
// Read vint from arbitrary byte array.
177
uint64 RawGetV(const byte *Data,uint &ReadPos,uint DataSize,bool &Overflow)
178
{
179
  Overflow=false;
180
  uint64 Result=0;
181
  for (uint Shift=0;ReadPos<DataSize;Shift+=7)
182
  {
183
    byte CurByte=Data[ReadPos++];
184
    Result+=uint64(CurByte & 0x7f)<<Shift;
185
    if ((CurByte & 0x80)==0)
186
      return Result; // Decoded successfully.
187
  }
188
  Overflow=true;
189
  return 0; // Out of buffer border.
1 by Chris Anderson
Import upstream version 3.3.6
190
}