author | sherman |
Wed, 04 Jun 2014 11:25:13 -0700 | |
changeset 24710 | c019dc4104b2 |
permissions | -rw-r--r-- |
24710
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
1 |
/* |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
2 |
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
3 |
* |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
4 |
* This code is free software; you can redistribute it and/or modify it |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
5 |
* under the terms of the GNU General Public License version 2 only, as |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
6 |
* published by the Free Software Foundation. Oracle designates this |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
7 |
* particular file as subject to the "Classpath" exception as provided |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
8 |
* by Oracle in the LICENSE file that accompanied this code. |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
9 |
* |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
10 |
* This code is distributed in the hope that it will be useful, but WITHOUT |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
11 |
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
12 |
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
13 |
* version 2 for more details (a copy is included in the LICENSE file that |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
14 |
* accompanied this code). |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
15 |
* |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
16 |
* You should have received a copy of the GNU General Public License version |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
17 |
* 2 along with this work; if not, write to the Free Software Foundation, |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
18 |
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
19 |
* |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
20 |
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
21 |
* or visit www.oracle.com if you need additional information or have any |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
22 |
* questions. |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
23 |
*/ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
24 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
25 |
/* gzlib.c -- zlib functions common to reading and writing gzip files |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
26 |
* Copyright (C) 2004, 2010, 2011, 2012, 2013 Mark Adler |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
27 |
* For conditions of distribution and use, see copyright notice in zlib.h |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
28 |
*/ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
29 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
30 |
#include "gzguts.h" |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
31 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
32 |
#if defined(_WIN32) && !defined(__BORLANDC__) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
33 |
# define LSEEK _lseeki64 |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
34 |
#else |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
35 |
#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
36 |
# define LSEEK lseek64 |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
37 |
#else |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
38 |
# define LSEEK lseek |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
39 |
#endif |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
40 |
#endif |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
41 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
42 |
/* Local functions */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
43 |
local void gz_reset OF((gz_statep)); |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
44 |
local gzFile gz_open OF((const void *, int, const char *)); |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
45 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
46 |
#if defined UNDER_CE |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
47 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
48 |
/* Map the Windows error number in ERROR to a locale-dependent error message |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
49 |
string and return a pointer to it. Typically, the values for ERROR come |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
50 |
from GetLastError. |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
51 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
52 |
The string pointed to shall not be modified by the application, but may be |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
53 |
overwritten by a subsequent call to gz_strwinerror |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
54 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
55 |
The gz_strwinerror function does not change the current setting of |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
56 |
GetLastError. */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
57 |
char ZLIB_INTERNAL *gz_strwinerror (error) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
58 |
DWORD error; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
59 |
{ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
60 |
static char buf[1024]; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
61 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
62 |
wchar_t *msgbuf; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
63 |
DWORD lasterr = GetLastError(); |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
64 |
DWORD chars = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
65 |
| FORMAT_MESSAGE_ALLOCATE_BUFFER, |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
66 |
NULL, |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
67 |
error, |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
68 |
0, /* Default language */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
69 |
(LPVOID)&msgbuf, |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
70 |
0, |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
71 |
NULL); |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
72 |
if (chars != 0) { |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
73 |
/* If there is an \r\n appended, zap it. */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
74 |
if (chars >= 2 |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
75 |
&& msgbuf[chars - 2] == '\r' && msgbuf[chars - 1] == '\n') { |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
76 |
chars -= 2; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
77 |
msgbuf[chars] = 0; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
78 |
} |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
79 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
80 |
if (chars > sizeof (buf) - 1) { |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
81 |
chars = sizeof (buf) - 1; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
82 |
msgbuf[chars] = 0; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
83 |
} |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
84 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
85 |
wcstombs(buf, msgbuf, chars + 1); |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
86 |
LocalFree(msgbuf); |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
87 |
} |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
88 |
else { |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
89 |
sprintf(buf, "unknown win32 error (%ld)", error); |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
90 |
} |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
91 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
92 |
SetLastError(lasterr); |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
93 |
return buf; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
94 |
} |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
95 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
96 |
#endif /* UNDER_CE */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
97 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
98 |
/* Reset gzip file state */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
99 |
local void gz_reset(state) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
100 |
gz_statep state; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
101 |
{ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
102 |
state->x.have = 0; /* no output data available */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
103 |
if (state->mode == GZ_READ) { /* for reading ... */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
104 |
state->eof = 0; /* not at end of file */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
105 |
state->past = 0; /* have not read past end yet */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
106 |
state->how = LOOK; /* look for gzip header */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
107 |
} |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
108 |
state->seek = 0; /* no seek request pending */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
109 |
gz_error(state, Z_OK, NULL); /* clear error */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
110 |
state->x.pos = 0; /* no uncompressed data yet */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
111 |
state->strm.avail_in = 0; /* no input data yet */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
112 |
} |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
113 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
114 |
/* Open a gzip file either by name or file descriptor. */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
115 |
local gzFile gz_open(path, fd, mode) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
116 |
const void *path; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
117 |
int fd; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
118 |
const char *mode; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
119 |
{ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
120 |
gz_statep state; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
121 |
size_t len; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
122 |
int oflag; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
123 |
#ifdef O_CLOEXEC |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
124 |
int cloexec = 0; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
125 |
#endif |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
126 |
#ifdef O_EXCL |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
127 |
int exclusive = 0; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
128 |
#endif |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
129 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
130 |
/* check input */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
131 |
if (path == NULL) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
132 |
return NULL; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
133 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
134 |
/* allocate gzFile structure to return */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
135 |
state = (gz_statep)malloc(sizeof(gz_state)); |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
136 |
if (state == NULL) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
137 |
return NULL; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
138 |
state->size = 0; /* no buffers allocated yet */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
139 |
state->want = GZBUFSIZE; /* requested buffer size */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
140 |
state->msg = NULL; /* no error message yet */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
141 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
142 |
/* interpret mode */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
143 |
state->mode = GZ_NONE; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
144 |
state->level = Z_DEFAULT_COMPRESSION; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
145 |
state->strategy = Z_DEFAULT_STRATEGY; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
146 |
state->direct = 0; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
147 |
while (*mode) { |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
148 |
if (*mode >= '0' && *mode <= '9') |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
149 |
state->level = *mode - '0'; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
150 |
else |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
151 |
switch (*mode) { |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
152 |
case 'r': |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
153 |
state->mode = GZ_READ; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
154 |
break; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
155 |
#ifndef NO_GZCOMPRESS |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
156 |
case 'w': |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
157 |
state->mode = GZ_WRITE; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
158 |
break; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
159 |
case 'a': |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
160 |
state->mode = GZ_APPEND; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
161 |
break; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
162 |
#endif |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
163 |
case '+': /* can't read and write at the same time */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
164 |
free(state); |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
165 |
return NULL; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
166 |
case 'b': /* ignore -- will request binary anyway */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
167 |
break; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
168 |
#ifdef O_CLOEXEC |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
169 |
case 'e': |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
170 |
cloexec = 1; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
171 |
break; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
172 |
#endif |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
173 |
#ifdef O_EXCL |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
174 |
case 'x': |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
175 |
exclusive = 1; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
176 |
break; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
177 |
#endif |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
178 |
case 'f': |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
179 |
state->strategy = Z_FILTERED; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
180 |
break; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
181 |
case 'h': |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
182 |
state->strategy = Z_HUFFMAN_ONLY; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
183 |
break; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
184 |
case 'R': |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
185 |
state->strategy = Z_RLE; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
186 |
break; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
187 |
case 'F': |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
188 |
state->strategy = Z_FIXED; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
189 |
break; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
190 |
case 'T': |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
191 |
state->direct = 1; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
192 |
break; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
193 |
default: /* could consider as an error, but just ignore */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
194 |
; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
195 |
} |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
196 |
mode++; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
197 |
} |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
198 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
199 |
/* must provide an "r", "w", or "a" */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
200 |
if (state->mode == GZ_NONE) { |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
201 |
free(state); |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
202 |
return NULL; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
203 |
} |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
204 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
205 |
/* can't force transparent read */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
206 |
if (state->mode == GZ_READ) { |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
207 |
if (state->direct) { |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
208 |
free(state); |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
209 |
return NULL; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
210 |
} |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
211 |
state->direct = 1; /* for empty file */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
212 |
} |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
213 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
214 |
/* save the path name for error messages */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
215 |
#ifdef _WIN32 |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
216 |
if (fd == -2) { |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
217 |
len = wcstombs(NULL, path, 0); |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
218 |
if (len == (size_t)-1) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
219 |
len = 0; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
220 |
} |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
221 |
else |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
222 |
#endif |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
223 |
len = strlen((const char *)path); |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
224 |
state->path = (char *)malloc(len + 1); |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
225 |
if (state->path == NULL) { |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
226 |
free(state); |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
227 |
return NULL; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
228 |
} |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
229 |
#ifdef _WIN32 |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
230 |
if (fd == -2) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
231 |
if (len) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
232 |
wcstombs(state->path, path, len + 1); |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
233 |
else |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
234 |
*(state->path) = 0; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
235 |
else |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
236 |
#endif |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
237 |
#if !defined(NO_snprintf) && !defined(NO_vsnprintf) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
238 |
snprintf(state->path, len + 1, "%s", (const char *)path); |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
239 |
#else |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
240 |
strcpy(state->path, path); |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
241 |
#endif |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
242 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
243 |
/* compute the flags for open() */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
244 |
oflag = |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
245 |
#ifdef O_LARGEFILE |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
246 |
O_LARGEFILE | |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
247 |
#endif |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
248 |
#ifdef O_BINARY |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
249 |
O_BINARY | |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
250 |
#endif |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
251 |
#ifdef O_CLOEXEC |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
252 |
(cloexec ? O_CLOEXEC : 0) | |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
253 |
#endif |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
254 |
(state->mode == GZ_READ ? |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
255 |
O_RDONLY : |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
256 |
(O_WRONLY | O_CREAT | |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
257 |
#ifdef O_EXCL |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
258 |
(exclusive ? O_EXCL : 0) | |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
259 |
#endif |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
260 |
(state->mode == GZ_WRITE ? |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
261 |
O_TRUNC : |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
262 |
O_APPEND))); |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
263 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
264 |
/* open the file with the appropriate flags (or just use fd) */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
265 |
state->fd = fd > -1 ? fd : ( |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
266 |
#ifdef _WIN32 |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
267 |
fd == -2 ? _wopen(path, oflag, 0666) : |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
268 |
#endif |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
269 |
open((const char *)path, oflag, 0666)); |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
270 |
if (state->fd == -1) { |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
271 |
free(state->path); |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
272 |
free(state); |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
273 |
return NULL; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
274 |
} |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
275 |
if (state->mode == GZ_APPEND) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
276 |
state->mode = GZ_WRITE; /* simplify later checks */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
277 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
278 |
/* save the current position for rewinding (only if reading) */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
279 |
if (state->mode == GZ_READ) { |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
280 |
state->start = LSEEK(state->fd, 0, SEEK_CUR); |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
281 |
if (state->start == -1) state->start = 0; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
282 |
} |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
283 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
284 |
/* initialize stream */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
285 |
gz_reset(state); |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
286 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
287 |
/* return stream */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
288 |
return (gzFile)state; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
289 |
} |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
290 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
291 |
/* -- see zlib.h -- */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
292 |
gzFile ZEXPORT gzopen(path, mode) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
293 |
const char *path; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
294 |
const char *mode; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
295 |
{ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
296 |
return gz_open(path, -1, mode); |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
297 |
} |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
298 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
299 |
/* -- see zlib.h -- */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
300 |
gzFile ZEXPORT gzopen64(path, mode) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
301 |
const char *path; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
302 |
const char *mode; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
303 |
{ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
304 |
return gz_open(path, -1, mode); |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
305 |
} |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
306 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
307 |
/* -- see zlib.h -- */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
308 |
gzFile ZEXPORT gzdopen(fd, mode) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
309 |
int fd; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
310 |
const char *mode; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
311 |
{ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
312 |
char *path; /* identifier for error messages */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
313 |
gzFile gz; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
314 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
315 |
if (fd == -1 || (path = (char *)malloc(7 + 3 * sizeof(int))) == NULL) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
316 |
return NULL; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
317 |
#if !defined(NO_snprintf) && !defined(NO_vsnprintf) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
318 |
snprintf(path, 7 + 3 * sizeof(int), "<fd:%d>", fd); /* for debugging */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
319 |
#else |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
320 |
sprintf(path, "<fd:%d>", fd); /* for debugging */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
321 |
#endif |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
322 |
gz = gz_open(path, fd, mode); |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
323 |
free(path); |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
324 |
return gz; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
325 |
} |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
326 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
327 |
/* -- see zlib.h -- */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
328 |
#ifdef _WIN32 |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
329 |
gzFile ZEXPORT gzopen_w(path, mode) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
330 |
const wchar_t *path; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
331 |
const char *mode; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
332 |
{ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
333 |
return gz_open(path, -2, mode); |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
334 |
} |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
335 |
#endif |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
336 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
337 |
/* -- see zlib.h -- */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
338 |
int ZEXPORT gzbuffer(file, size) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
339 |
gzFile file; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
340 |
unsigned size; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
341 |
{ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
342 |
gz_statep state; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
343 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
344 |
/* get internal structure and check integrity */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
345 |
if (file == NULL) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
346 |
return -1; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
347 |
state = (gz_statep)file; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
348 |
if (state->mode != GZ_READ && state->mode != GZ_WRITE) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
349 |
return -1; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
350 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
351 |
/* make sure we haven't already allocated memory */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
352 |
if (state->size != 0) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
353 |
return -1; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
354 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
355 |
/* check and set requested size */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
356 |
if (size < 2) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
357 |
size = 2; /* need two bytes to check magic header */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
358 |
state->want = size; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
359 |
return 0; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
360 |
} |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
361 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
362 |
/* -- see zlib.h -- */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
363 |
int ZEXPORT gzrewind(file) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
364 |
gzFile file; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
365 |
{ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
366 |
gz_statep state; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
367 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
368 |
/* get internal structure */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
369 |
if (file == NULL) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
370 |
return -1; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
371 |
state = (gz_statep)file; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
372 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
373 |
/* check that we're reading and that there's no error */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
374 |
if (state->mode != GZ_READ || |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
375 |
(state->err != Z_OK && state->err != Z_BUF_ERROR)) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
376 |
return -1; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
377 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
378 |
/* back up and start over */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
379 |
if (LSEEK(state->fd, state->start, SEEK_SET) == -1) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
380 |
return -1; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
381 |
gz_reset(state); |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
382 |
return 0; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
383 |
} |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
384 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
385 |
/* -- see zlib.h -- */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
386 |
z_off64_t ZEXPORT gzseek64(file, offset, whence) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
387 |
gzFile file; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
388 |
z_off64_t offset; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
389 |
int whence; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
390 |
{ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
391 |
unsigned n; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
392 |
z_off64_t ret; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
393 |
gz_statep state; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
394 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
395 |
/* get internal structure and check integrity */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
396 |
if (file == NULL) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
397 |
return -1; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
398 |
state = (gz_statep)file; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
399 |
if (state->mode != GZ_READ && state->mode != GZ_WRITE) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
400 |
return -1; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
401 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
402 |
/* check that there's no error */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
403 |
if (state->err != Z_OK && state->err != Z_BUF_ERROR) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
404 |
return -1; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
405 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
406 |
/* can only seek from start or relative to current position */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
407 |
if (whence != SEEK_SET && whence != SEEK_CUR) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
408 |
return -1; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
409 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
410 |
/* normalize offset to a SEEK_CUR specification */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
411 |
if (whence == SEEK_SET) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
412 |
offset -= state->x.pos; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
413 |
else if (state->seek) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
414 |
offset += state->skip; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
415 |
state->seek = 0; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
416 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
417 |
/* if within raw area while reading, just go there */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
418 |
if (state->mode == GZ_READ && state->how == COPY && |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
419 |
state->x.pos + offset >= 0) { |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
420 |
ret = LSEEK(state->fd, offset - state->x.have, SEEK_CUR); |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
421 |
if (ret == -1) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
422 |
return -1; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
423 |
state->x.have = 0; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
424 |
state->eof = 0; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
425 |
state->past = 0; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
426 |
state->seek = 0; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
427 |
gz_error(state, Z_OK, NULL); |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
428 |
state->strm.avail_in = 0; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
429 |
state->x.pos += offset; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
430 |
return state->x.pos; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
431 |
} |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
432 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
433 |
/* calculate skip amount, rewinding if needed for back seek when reading */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
434 |
if (offset < 0) { |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
435 |
if (state->mode != GZ_READ) /* writing -- can't go backwards */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
436 |
return -1; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
437 |
offset += state->x.pos; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
438 |
if (offset < 0) /* before start of file! */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
439 |
return -1; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
440 |
if (gzrewind(file) == -1) /* rewind, then skip to offset */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
441 |
return -1; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
442 |
} |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
443 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
444 |
/* if reading, skip what's in output buffer (one less gzgetc() check) */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
445 |
if (state->mode == GZ_READ) { |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
446 |
n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > offset ? |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
447 |
(unsigned)offset : state->x.have; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
448 |
state->x.have -= n; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
449 |
state->x.next += n; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
450 |
state->x.pos += n; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
451 |
offset -= n; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
452 |
} |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
453 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
454 |
/* request skip (if not zero) */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
455 |
if (offset) { |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
456 |
state->seek = 1; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
457 |
state->skip = offset; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
458 |
} |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
459 |
return state->x.pos + offset; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
460 |
} |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
461 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
462 |
/* -- see zlib.h -- */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
463 |
z_off_t ZEXPORT gzseek(file, offset, whence) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
464 |
gzFile file; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
465 |
z_off_t offset; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
466 |
int whence; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
467 |
{ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
468 |
z_off64_t ret; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
469 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
470 |
ret = gzseek64(file, (z_off64_t)offset, whence); |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
471 |
return ret == (z_off_t)ret ? (z_off_t)ret : -1; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
472 |
} |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
473 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
474 |
/* -- see zlib.h -- */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
475 |
z_off64_t ZEXPORT gztell64(file) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
476 |
gzFile file; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
477 |
{ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
478 |
gz_statep state; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
479 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
480 |
/* get internal structure and check integrity */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
481 |
if (file == NULL) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
482 |
return -1; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
483 |
state = (gz_statep)file; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
484 |
if (state->mode != GZ_READ && state->mode != GZ_WRITE) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
485 |
return -1; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
486 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
487 |
/* return position */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
488 |
return state->x.pos + (state->seek ? state->skip : 0); |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
489 |
} |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
490 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
491 |
/* -- see zlib.h -- */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
492 |
z_off_t ZEXPORT gztell(file) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
493 |
gzFile file; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
494 |
{ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
495 |
z_off64_t ret; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
496 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
497 |
ret = gztell64(file); |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
498 |
return ret == (z_off_t)ret ? (z_off_t)ret : -1; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
499 |
} |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
500 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
501 |
/* -- see zlib.h -- */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
502 |
z_off64_t ZEXPORT gzoffset64(file) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
503 |
gzFile file; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
504 |
{ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
505 |
z_off64_t offset; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
506 |
gz_statep state; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
507 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
508 |
/* get internal structure and check integrity */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
509 |
if (file == NULL) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
510 |
return -1; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
511 |
state = (gz_statep)file; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
512 |
if (state->mode != GZ_READ && state->mode != GZ_WRITE) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
513 |
return -1; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
514 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
515 |
/* compute and return effective offset in file */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
516 |
offset = LSEEK(state->fd, 0, SEEK_CUR); |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
517 |
if (offset == -1) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
518 |
return -1; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
519 |
if (state->mode == GZ_READ) /* reading */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
520 |
offset -= state->strm.avail_in; /* don't count buffered input */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
521 |
return offset; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
522 |
} |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
523 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
524 |
/* -- see zlib.h -- */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
525 |
z_off_t ZEXPORT gzoffset(file) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
526 |
gzFile file; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
527 |
{ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
528 |
z_off64_t ret; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
529 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
530 |
ret = gzoffset64(file); |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
531 |
return ret == (z_off_t)ret ? (z_off_t)ret : -1; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
532 |
} |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
533 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
534 |
/* -- see zlib.h -- */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
535 |
int ZEXPORT gzeof(file) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
536 |
gzFile file; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
537 |
{ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
538 |
gz_statep state; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
539 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
540 |
/* get internal structure and check integrity */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
541 |
if (file == NULL) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
542 |
return 0; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
543 |
state = (gz_statep)file; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
544 |
if (state->mode != GZ_READ && state->mode != GZ_WRITE) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
545 |
return 0; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
546 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
547 |
/* return end-of-file state */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
548 |
return state->mode == GZ_READ ? state->past : 0; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
549 |
} |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
550 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
551 |
/* -- see zlib.h -- */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
552 |
const char * ZEXPORT gzerror(file, errnum) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
553 |
gzFile file; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
554 |
int *errnum; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
555 |
{ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
556 |
gz_statep state; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
557 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
558 |
/* get internal structure and check integrity */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
559 |
if (file == NULL) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
560 |
return NULL; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
561 |
state = (gz_statep)file; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
562 |
if (state->mode != GZ_READ && state->mode != GZ_WRITE) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
563 |
return NULL; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
564 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
565 |
/* return error information */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
566 |
if (errnum != NULL) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
567 |
*errnum = state->err; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
568 |
return state->err == Z_MEM_ERROR ? "out of memory" : |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
569 |
(state->msg == NULL ? "" : state->msg); |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
570 |
} |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
571 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
572 |
/* -- see zlib.h -- */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
573 |
void ZEXPORT gzclearerr(file) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
574 |
gzFile file; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
575 |
{ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
576 |
gz_statep state; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
577 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
578 |
/* get internal structure and check integrity */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
579 |
if (file == NULL) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
580 |
return; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
581 |
state = (gz_statep)file; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
582 |
if (state->mode != GZ_READ && state->mode != GZ_WRITE) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
583 |
return; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
584 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
585 |
/* clear error and end-of-file */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
586 |
if (state->mode == GZ_READ) { |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
587 |
state->eof = 0; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
588 |
state->past = 0; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
589 |
} |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
590 |
gz_error(state, Z_OK, NULL); |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
591 |
} |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
592 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
593 |
/* Create an error message in allocated memory and set state->err and |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
594 |
state->msg accordingly. Free any previous error message already there. Do |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
595 |
not try to free or allocate space if the error is Z_MEM_ERROR (out of |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
596 |
memory). Simply save the error message as a static string. If there is an |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
597 |
allocation failure constructing the error message, then convert the error to |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
598 |
out of memory. */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
599 |
void ZLIB_INTERNAL gz_error(state, err, msg) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
600 |
gz_statep state; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
601 |
int err; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
602 |
const char *msg; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
603 |
{ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
604 |
/* free previously allocated message and clear */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
605 |
if (state->msg != NULL) { |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
606 |
if (state->err != Z_MEM_ERROR) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
607 |
free(state->msg); |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
608 |
state->msg = NULL; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
609 |
} |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
610 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
611 |
/* if fatal, set state->x.have to 0 so that the gzgetc() macro fails */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
612 |
if (err != Z_OK && err != Z_BUF_ERROR) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
613 |
state->x.have = 0; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
614 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
615 |
/* set error code, and if no message, then done */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
616 |
state->err = err; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
617 |
if (msg == NULL) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
618 |
return; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
619 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
620 |
/* for an out of memory error, return literal string when requested */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
621 |
if (err == Z_MEM_ERROR) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
622 |
return; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
623 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
624 |
/* construct error message with path */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
625 |
if ((state->msg = (char *)malloc(strlen(state->path) + strlen(msg) + 3)) == |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
626 |
NULL) { |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
627 |
state->err = Z_MEM_ERROR; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
628 |
return; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
629 |
} |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
630 |
#if !defined(NO_snprintf) && !defined(NO_vsnprintf) |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
631 |
snprintf(state->msg, strlen(state->path) + strlen(msg) + 3, |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
632 |
"%s%s%s", state->path, ": ", msg); |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
633 |
#else |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
634 |
strcpy(state->msg, state->path); |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
635 |
strcat(state->msg, ": "); |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
636 |
strcat(state->msg, msg); |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
637 |
#endif |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
638 |
return; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
639 |
} |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
640 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
641 |
#ifndef INT_MAX |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
642 |
/* portably return maximum value for an int (when limits.h presumed not |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
643 |
available) -- we need to do this to cover cases where 2's complement not |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
644 |
used, since C standard permits 1's complement and sign-bit representations, |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
645 |
otherwise we could just use ((unsigned)-1) >> 1 */ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
646 |
unsigned ZLIB_INTERNAL gz_intmax() |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
647 |
{ |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
648 |
unsigned p, q; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
649 |
|
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
650 |
p = 1; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
651 |
do { |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
652 |
q = p; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
653 |
p <<= 1; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
654 |
p++; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
655 |
} while (p > q); |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
656 |
return q >> 1; |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
657 |
} |
c019dc4104b2
8044725: Bug in zlib 1.2.5 prevents inflation of some gzipped files
sherman
parents:
diff
changeset
|
658 |
#endif |