Blame


1 b6afd33e 2003-11-23 devnull #include <u.h>
2 b6afd33e 2003-11-23 devnull #include <libc.h>
3 b6afd33e 2003-11-23 devnull #include <flate.h>
4 b6afd33e 2003-11-23 devnull #include "zlib.h"
5 b6afd33e 2003-11-23 devnull
6 b6afd33e 2003-11-23 devnull typedef struct Block Block;
7 b6afd33e 2003-11-23 devnull
8 b6afd33e 2003-11-23 devnull struct Block
9 b6afd33e 2003-11-23 devnull {
10 b6afd33e 2003-11-23 devnull uchar *pos;
11 b6afd33e 2003-11-23 devnull uchar *limit;
12 b6afd33e 2003-11-23 devnull };
13 b6afd33e 2003-11-23 devnull
14 b6afd33e 2003-11-23 devnull static int
15 b6afd33e 2003-11-23 devnull blgetc(void *vb)
16 b6afd33e 2003-11-23 devnull {
17 b6afd33e 2003-11-23 devnull Block *b;
18 b6afd33e 2003-11-23 devnull
19 b6afd33e 2003-11-23 devnull b = vb;
20 b6afd33e 2003-11-23 devnull if(b->pos >= b->limit)
21 b6afd33e 2003-11-23 devnull return -1;
22 b6afd33e 2003-11-23 devnull return *b->pos++;
23 b6afd33e 2003-11-23 devnull }
24 b6afd33e 2003-11-23 devnull
25 b6afd33e 2003-11-23 devnull static int
26 b6afd33e 2003-11-23 devnull blwrite(void *vb, void *buf, int n)
27 b6afd33e 2003-11-23 devnull {
28 b6afd33e 2003-11-23 devnull Block *b;
29 b6afd33e 2003-11-23 devnull
30 b6afd33e 2003-11-23 devnull b = vb;
31 b6afd33e 2003-11-23 devnull
32 b6afd33e 2003-11-23 devnull if(n > b->limit - b->pos)
33 b6afd33e 2003-11-23 devnull n = b->limit - b->pos;
34 b6afd33e 2003-11-23 devnull memmove(b->pos, buf, n);
35 b6afd33e 2003-11-23 devnull b->pos += n;
36 b6afd33e 2003-11-23 devnull return n;
37 b6afd33e 2003-11-23 devnull }
38 b6afd33e 2003-11-23 devnull
39 b6afd33e 2003-11-23 devnull int
40 b6afd33e 2003-11-23 devnull inflatezlibblock(uchar *dst, int dsize, uchar *src, int ssize)
41 b6afd33e 2003-11-23 devnull {
42 b6afd33e 2003-11-23 devnull Block bd, bs;
43 b6afd33e 2003-11-23 devnull int ok;
44 b6afd33e 2003-11-23 devnull
45 b6afd33e 2003-11-23 devnull if(ssize < 6)
46 b6afd33e 2003-11-23 devnull return FlateInputFail;
47 b6afd33e 2003-11-23 devnull
48 b6afd33e 2003-11-23 devnull if(((src[0] << 8) | src[1]) % 31)
49 b6afd33e 2003-11-23 devnull return FlateCorrupted;
50 b6afd33e 2003-11-23 devnull if((src[0] & ZlibMeth) != ZlibDeflate
51 b6afd33e 2003-11-23 devnull || (src[0] & ZlibCInfo) > ZlibWin32k)
52 b6afd33e 2003-11-23 devnull return FlateCorrupted;
53 b6afd33e 2003-11-23 devnull
54 b6afd33e 2003-11-23 devnull bs.pos = src + 2;
55 b6afd33e 2003-11-23 devnull bs.limit = src + ssize - 6;
56 b6afd33e 2003-11-23 devnull
57 b6afd33e 2003-11-23 devnull bd.pos = dst;
58 b6afd33e 2003-11-23 devnull bd.limit = dst + dsize;
59 b6afd33e 2003-11-23 devnull
60 b6afd33e 2003-11-23 devnull ok = inflate(&bd, blwrite, &bs, blgetc);
61 b6afd33e 2003-11-23 devnull if(ok != FlateOk)
62 b6afd33e 2003-11-23 devnull return ok;
63 b6afd33e 2003-11-23 devnull
64 b6afd33e 2003-11-23 devnull if(adler32(1, dst, bs.pos - dst) != ((bs.pos[0] << 24) | (bs.pos[1] << 16) | (bs.pos[2] << 8) | bs.pos[3]))
65 b6afd33e 2003-11-23 devnull return FlateCorrupted;
66 b6afd33e 2003-11-23 devnull
67 b6afd33e 2003-11-23 devnull return bd.pos - dst;
68 b6afd33e 2003-11-23 devnull }