@@ -32,84 +32,14 @@ qint32 LZS::dad[4097];
3232unsigned char LZS ::text_buf[4113 ];
3333QByteArray LZS ::result;
3434
35- const QByteArray &LZS ::decompress(const QByteArray &data, int max, LZSObserver *observer)
36- {
37- return decompress (data.constData (), data.size (), max, observer);
38- }
39-
40- const QByteArray &LZS ::decompress(const char *data, int fileSize, int max, LZSObserver *observer)
41- {
42- int curResult = 0 , sizeAlloc = max + 10 ;
43- quint16 curBuff = 4078 , offset, flagByte = 0 , i, length;
44- const quint8 *fileData = (const quint8 *)data,
45- *endFileData = fileData + fileSize;
46-
47- if (observer) {
48- observer->setMaximum (fileSize);
49- }
50-
51- // Impossible case
52- if (quint64 (sizeAlloc) > 2000 * quint64 (fileSize)) {
53- qWarning () << " LZS::decompress impossible ratio case" << sizeAlloc << 2000 * quint64 (fileSize);
54- result.clear ();
55- return result;
56- }
57-
58- // Reduce the amount of realloc
59- if (result.size () < sizeAlloc) {
60- try {
61- result.resize (sizeAlloc);
62- } catch (std::bad_alloc) {
63- result.clear ();
64- return result;
65- }
66- }
67-
68- memset (text_buf, 0 , 4078 ); // The buffer of 4096 bytes is set to 0
69-
70- forever {
71- if (((flagByte >>= 1 ) & 256 ) == 0 ) {
72- flagByte = *fileData++ | 0xff00 ; // First byte
73- }
74-
75- if (observer) { // Output
76- observer->setValue (fileData - (const quint8 *)data);
77- }
78-
79- if (fileData >= endFileData || curResult >= max) {
80- result.truncate (curResult);
81- return result; // Ending
82- }
83-
84- if (flagByte & 1 ) {
85- // Uncompressed byte
86- result[curResult] = text_buf[curBuff] = *fileData++;
87- curBuff = (curBuff + 1 ) & 4095 ;
88- ++curResult;
89- } else {
90- // Infos to retrieve uncompressed data
91- offset = *fileData++;
92- length = *fileData++;
93- offset |= (length & 0xF0 ) << 4 ;
94- length = (length & 0xF ) + 2 + offset;
95-
96- for (i = offset; i <= length; ++i) {
97- result[curResult] = text_buf[curBuff] = text_buf[i & 4095 ];
98- curBuff = (curBuff + 1 ) & 4095 ;
99- ++curResult;
100- }
101- }
102- }
103- }
104-
10535const QByteArray &LZS ::decompressAll(const QByteArray &data, LZSObserver *observer)
10636{
10737 return decompressAll (data.constData (), data.size (), observer);
10838}
10939
11040const QByteArray &LZS ::decompressAll(const char *data, int fileSize, LZSObserver *observer)
11141{
112- int curResult = 0 , sizeAlloc = fileSize * 5 ;
42+ int curResult = 0 , sizeAlloc = int ( qMin ( quint64 ( fileSize * 5 ), quint64 ( INT_MAX ))) ;
11343 quint16 curBuff = 4078 , offset, flagByte = 0 , i, length;
11444 const quint8 *fileData = (const quint8 *)data,
11545 *endFileData = fileData + fileSize;
@@ -118,19 +48,12 @@ const QByteArray &LZS::decompressAll(const char *data, int fileSize, LZSObserver
11848 observer->setMaximum (fileSize);
11949 }
12050
121- // Impossible case
122- if (sizeAlloc > 2000 * fileSize) {
123- result.clear ();
124- return result;
125- }
126-
12751 // Reduce the amount of realloc
12852 if (result.size () < sizeAlloc) {
12953 try {
13054 result.resize (sizeAlloc);
13155 } catch (std::bad_alloc) {
132- result.clear ();
133- return result;
56+ // Ignore, try anyway
13457 }
13558 }
13659
0 commit comments