… | |
… | |
143 | |
143 | |
144 | csize -= skip; |
144 | csize -= skip; |
145 | |
145 | |
146 | if (src[0]) |
146 | if (src[0]) |
147 | { |
147 | { |
148 | if (!(src[0] & 0x80)) |
148 | if (!(src[0] & 0x80) && csize >= 1) |
149 | { |
149 | { |
150 | csize -= 1; |
150 | csize -= 1; |
151 | usize = *src++ & 0xff; |
151 | usize = *src++ & 0xff; |
152 | } |
152 | } |
153 | else if (!(src[0] & 0x20)) |
153 | else if (!(src[0] & 0x20) && csize >= 2) |
154 | { |
154 | { |
155 | csize -= 2; |
155 | csize -= 2; |
156 | usize = *src++ & 0x1f; |
156 | usize = *src++ & 0x1f; |
157 | usize = (usize << 6) | (*src++ & 0x3f); |
157 | usize = (usize << 6) | (*src++ & 0x3f); |
158 | } |
158 | } |
159 | else if (!(src[0] & 0x10)) |
159 | else if (!(src[0] & 0x10) && csize >= 3) |
160 | { |
160 | { |
161 | csize -= 3; |
161 | csize -= 3; |
162 | usize = *src++ & 0x0f; |
162 | usize = *src++ & 0x0f; |
163 | usize = (usize << 6) | (*src++ & 0x3f); |
163 | usize = (usize << 6) | (*src++ & 0x3f); |
164 | usize = (usize << 6) | (*src++ & 0x3f); |
164 | usize = (usize << 6) | (*src++ & 0x3f); |
165 | } |
165 | } |
166 | else if (!(src[0] & 0x08)) |
166 | else if (!(src[0] & 0x08) && csize >= 4) |
167 | { |
167 | { |
168 | csize -= 4; |
168 | csize -= 4; |
169 | usize = *src++ & 0x07; |
169 | usize = *src++ & 0x07; |
170 | usize = (usize << 6) | (*src++ & 0x3f); |
170 | usize = (usize << 6) | (*src++ & 0x3f); |
171 | usize = (usize << 6) | (*src++ & 0x3f); |
171 | usize = (usize << 6) | (*src++ & 0x3f); |
172 | usize = (usize << 6) | (*src++ & 0x3f); |
172 | usize = (usize << 6) | (*src++ & 0x3f); |
173 | } |
173 | } |
174 | else if (!(src[0] & 0x04)) |
174 | else if (!(src[0] & 0x04) && csize >= 5) |
175 | { |
175 | { |
176 | csize -= 5; |
176 | csize -= 5; |
177 | usize = *src++ & 0x03; |
177 | usize = *src++ & 0x03; |
178 | usize = (usize << 6) | (*src++ & 0x3f); |
178 | usize = (usize << 6) | (*src++ & 0x3f); |
179 | usize = (usize << 6) | (*src++ & 0x3f); |
179 | usize = (usize << 6) | (*src++ & 0x3f); |
180 | usize = (usize << 6) | (*src++ & 0x3f); |
180 | usize = (usize << 6) | (*src++ & 0x3f); |
181 | usize = (usize << 6) | (*src++ & 0x3f); |
181 | usize = (usize << 6) | (*src++ & 0x3f); |
182 | } |
182 | } |
183 | else if (!(src[0] & 0x02)) |
183 | else if (!(src[0] & 0x02) && csize >= 6) |
184 | { |
184 | { |
185 | csize -= 6; |
185 | csize -= 6; |
186 | usize = *src++ & 0x01; |
186 | usize = *src++ & 0x01; |
187 | usize = (usize << 6) | (*src++ & 0x3f); |
187 | usize = (usize << 6) | (*src++ & 0x3f); |
188 | usize = (usize << 6) | (*src++ & 0x3f); |
188 | usize = (usize << 6) | (*src++ & 0x3f); |
189 | usize = (usize << 6) | (*src++ & 0x3f); |
189 | usize = (usize << 6) | (*src++ & 0x3f); |
190 | usize = (usize << 6) | (*src++ & 0x3f); |
190 | usize = (usize << 6) | (*src++ & 0x3f); |
191 | usize = (usize << 6) | (*src++ & 0x3f); |
191 | usize = (usize << 6) | (*src++ & 0x3f); |
192 | } |
192 | } |
193 | else |
193 | else |
|
|
194 | croak ("compressed data corrupted (invalid length)"); |
|
|
195 | |
|
|
196 | if (!usize) |
194 | croak ("compressed data corrupted (invalid length)"); |
197 | croak ("compressed data corrupted (invalid length)"); |
195 | |
198 | |
196 | ret = NEWSV (0, usize); |
199 | ret = NEWSV (0, usize); |
197 | SvPOK_only (ret); |
200 | SvPOK_only (ret); |
198 | dst = SvPVX (ret); |
201 | dst = SvPVX (ret); |
199 | |
202 | |
200 | if (lzf_decompress (src, csize, dst, usize) != usize) |
203 | if (lzf_decompress (src, csize, dst, usize) != usize) |
|
|
204 | { |
|
|
205 | SvREFCNT_dec (ret); |
201 | croak ("compressed data corrupted (size mismatch)", csize, skip, usize); |
206 | croak ("compressed data corrupted (size mismatch)", csize, skip, usize); |
|
|
207 | } |
202 | } |
208 | } |
203 | else |
209 | else |
204 | { |
210 | { |
205 | usize = csize - 1; |
211 | usize = csize - 1; |
206 | ret = NEWSV (0, usize); |
212 | ret = NEWSV (0, usize | 1); |
207 | SvPOK_only (ret); |
213 | SvPOK_only (ret); |
208 | |
214 | |
209 | Move ((void *)(src + 1), (void *)SvPVX (ret), usize, unsigned char); |
215 | Move ((void *)(src + 1), (void *)SvPVX (ret), usize, unsigned char); |
210 | } |
216 | } |
211 | |
217 | |