1 /*
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
3 *
4 * This code is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License version 2 only, as
6 * published by the Free Software Foundation. Oracle designates this
7 * particular file as subject to the "Classpath" exception as provided
8 * by Oracle in the LICENSE file that accompanied this code.
9 *
10 * This code is distributed in the hope that it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13 * version 2 for more details (a copy is included in the LICENSE file that
14 * accompanied this code).
15 *
16 * You should have received a copy of the GNU General Public License version
17 * 2 along with this work; if not, write to the Free Software Foundation,
18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
19 *
20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
21 * or visit www.oracle.com if you need additional information or have any
22 * questions.
23 */
24
25 /* gzread.c -- zlib functions for reading gzip files
26 * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013, 2016 Mark Adler
27 * For conditions of distribution and use, see copyright notice in zlib.h
28 */
29
30 #include "gzguts.h"
31
32 /* Local functions */
33 local int gz_load OF((gz_statep, unsigned char *, unsigned, unsigned *));
34 local int gz_avail OF((gz_statep));
35 local int gz_look OF((gz_statep));
36 local int gz_decomp OF((gz_statep));
37 local int gz_fetch OF((gz_statep));
38 local int gz_skip OF((gz_statep, z_off64_t));
39 local z_size_t gz_read OF((gz_statep, voidp, z_size_t));
40
41 /* Use read() to load a buffer -- return -1 on error, otherwise 0. Read from
42 state->fd, and update state->eof, state->err, and state->msg as appropriate.
43 This function needs to loop on read(), since read() is not guaranteed to
44 read the number of bytes requested, depending on the type of descriptor. */
gz_load(state,buf,len,have)45 local int gz_load(state, buf, len, have)
46 gz_statep state;
47 unsigned char *buf;
48 unsigned len;
49 unsigned *have;
50 {
51 int ret;
52 unsigned get, max = ((unsigned)-1 >> 2) + 1;
53
54 *have = 0;
55 do {
56 get = len - *have;
57 if (get > max)
58 get = max;
59 ret = read(state->fd, buf + *have, get);
60 if (ret <= 0)
61 break;
62 *have += (unsigned)ret;
63 } while (*have < len);
64 if (ret < 0) {
65 gz_error(state, Z_ERRNO, zstrerror());
66 return -1;
67 }
68 if (ret == 0)
69 state->eof = 1;
70 return 0;
71 }
72
73 /* Load up input buffer and set eof flag if last data loaded -- return -1 on
74 error, 0 otherwise. Note that the eof flag is set when the end of the input
75 file is reached, even though there may be unused data in the buffer. Once
76 that data has been used, no more attempts will be made to read the file.
77 If strm->avail_in != 0, then the current data is moved to the beginning of
78 the input buffer, and then the remainder of the buffer is loaded with the
79 available data from the input file. */
gz_avail(state)80 local int gz_avail(state)
81 gz_statep state;
82 {
83 unsigned got;
84 z_streamp strm = &(state->strm);
85
86 if (state->err != Z_OK && state->err != Z_BUF_ERROR)
87 return -1;
88 if (state->eof == 0) {
89 if (strm->avail_in) { /* copy what's there to the start */
90 unsigned char *p = state->in;
91 unsigned const char *q = strm->next_in;
92 unsigned n = strm->avail_in;
93 do {
94 *p++ = *q++;
95 } while (--n);
96 }
97 if (gz_load(state, state->in + strm->avail_in,
98 state->size - strm->avail_in, &got) == -1)
99 return -1;
100 strm->avail_in += got;
101 strm->next_in = state->in;
102 }
103 return 0;
104 }
105
106 /* Look for gzip header, set up for inflate or copy. state->x.have must be 0.
107 If this is the first time in, allocate required memory. state->how will be
108 left unchanged if there is no more input data available, will be set to COPY
109 if there is no gzip header and direct copying will be performed, or it will
110 be set to GZIP for decompression. If direct copying, then leftover input
111 data from the input buffer will be copied to the output buffer. In that
112 case, all further file reads will be directly to either the output buffer or
113 a user buffer. If decompressing, the inflate state will be initialized.
114 gz_look() will return 0 on success or -1 on failure. */
gz_look(state)115 local int gz_look(state)
116 gz_statep state;
117 {
118 z_streamp strm = &(state->strm);
119
120 /* allocate read buffers and inflate memory */
121 if (state->size == 0) {
122 /* allocate buffers */
123 state->in = (unsigned char *)malloc(state->want);
124 state->out = (unsigned char *)malloc(state->want << 1);
125 if (state->in == NULL || state->out == NULL) {
126 free(state->out);
127 free(state->in);
128 gz_error(state, Z_MEM_ERROR, "out of memory");
129 return -1;
130 }
131 state->size = state->want;
132
133 /* allocate inflate memory */
134 state->strm.zalloc = Z_NULL;
135 state->strm.zfree = Z_NULL;
136 state->strm.opaque = Z_NULL;
137 state->strm.avail_in = 0;
138 state->strm.next_in = Z_NULL;
139 if (inflateInit2(&(state->strm), 15 + 16) != Z_OK) { /* gunzip */
140 free(state->out);
141 free(state->in);
142 state->size = 0;
143 gz_error(state, Z_MEM_ERROR, "out of memory");
144 return -1;
145 }
146 }
147
148 /* get at least the magic bytes in the input buffer */
149 if (strm->avail_in < 2) {
150 if (gz_avail(state) == -1)
151 return -1;
152 if (strm->avail_in == 0)
153 return 0;
154 }
155
156 /* look for gzip magic bytes -- if there, do gzip decoding (note: there is
157 a logical dilemma here when considering the case of a partially written
158 gzip file, to wit, if a single 31 byte is written, then we cannot tell
159 whether this is a single-byte file, or just a partially written gzip
160 file -- for here we assume that if a gzip file is being written, then
161 the header will be written in a single operation, so that reading a
162 single byte is sufficient indication that it is not a gzip file) */
163 if (strm->avail_in > 1 &&
164 strm->next_in[0] == 31 && strm->next_in[1] == 139) {
165 inflateReset(strm);
166 state->how = GZIP;
167 state->direct = 0;
168 return 0;
169 }
170
171 /* no gzip header -- if we were decoding gzip before, then this is trailing
172 garbage. Ignore the trailing garbage and finish. */
173 if (state->direct == 0) {
174 strm->avail_in = 0;
175 state->eof = 1;
176 state->x.have = 0;
177 return 0;
178 }
179
180 /* doing raw i/o, copy any leftover input to output -- this assumes that
181 the output buffer is larger than the input buffer, which also assures
182 space for gzungetc() */
183 state->x.next = state->out;
184 if (strm->avail_in) {
185 memcpy(state->x.next, strm->next_in, strm->avail_in);
186 state->x.have = strm->avail_in;
187 strm->avail_in = 0;
188 }
189 state->how = COPY;
190 state->direct = 1;
191 return 0;
192 }
193
194 /* Decompress from input to the provided next_out and avail_out in the state.
195 On return, state->x.have and state->x.next point to the just decompressed
196 data. If the gzip stream completes, state->how is reset to LOOK to look for
197 the next gzip stream or raw data, once state->x.have is depleted. Returns 0
198 on success, -1 on failure. */
gz_decomp(state)199 local int gz_decomp(state)
200 gz_statep state;
201 {
202 int ret = Z_OK;
203 unsigned had;
204 z_streamp strm = &(state->strm);
205
206 /* fill output buffer up to end of deflate stream */
207 had = strm->avail_out;
208 do {
209 /* get more input for inflate() */
210 if (strm->avail_in == 0 && gz_avail(state) == -1)
211 return -1;
212 if (strm->avail_in == 0) {
213 gz_error(state, Z_BUF_ERROR, "unexpected end of file");
214 break;
215 }
216
217 /* decompress and handle errors */
218 ret = inflate(strm, Z_NO_FLUSH);
219 if (ret == Z_STREAM_ERROR || ret == Z_NEED_DICT) {
220 gz_error(state, Z_STREAM_ERROR,
221 "internal error: inflate stream corrupt");
222 return -1;
223 }
224 if (ret == Z_MEM_ERROR) {
225 gz_error(state, Z_MEM_ERROR, "out of memory");
226 return -1;
227 }
228 if (ret == Z_DATA_ERROR) { /* deflate stream invalid */
229 gz_error(state, Z_DATA_ERROR,
230 strm->msg == NULL ? "compressed data error" : strm->msg);
231 return -1;
232 }
233 } while (strm->avail_out && ret != Z_STREAM_END);
234
235 /* update available output */
236 state->x.have = had - strm->avail_out;
237 state->x.next = strm->next_out - state->x.have;
238
239 /* if the gzip stream completed successfully, look for another */
240 if (ret == Z_STREAM_END)
241 state->how = LOOK;
242
243 /* good decompression */
244 return 0;
245 }
246
247 /* Fetch data and put it in the output buffer. Assumes state->x.have is 0.
248 Data is either copied from the input file or decompressed from the input
249 file depending on state->how. If state->how is LOOK, then a gzip header is
250 looked for to determine whether to copy or decompress. Returns -1 on error,
251 otherwise 0. gz_fetch() will leave state->how as COPY or GZIP unless the
252 end of the input file has been reached and all data has been processed. */
gz_fetch(state)253 local int gz_fetch(state)
254 gz_statep state;
255 {
256 z_streamp strm = &(state->strm);
257
258 do {
259 switch(state->how) {
260 case LOOK: /* -> LOOK, COPY (only if never GZIP), or GZIP */
261 if (gz_look(state) == -1)
262 return -1;
263 if (state->how == LOOK)
264 return 0;
265 break;
266 case COPY: /* -> COPY */
267 if (gz_load(state, state->out, state->size << 1, &(state->x.have))
268 == -1)
269 return -1;
270 state->x.next = state->out;
271 return 0;
272 case GZIP: /* -> GZIP or LOOK (if end of gzip stream) */
273 strm->avail_out = state->size << 1;
274 strm->next_out = state->out;
275 if (gz_decomp(state) == -1)
276 return -1;
277 }
278 } while (state->x.have == 0 && (!state->eof || strm->avail_in));
279 return 0;
280 }
281
282 /* Skip len uncompressed bytes of output. Return -1 on error, 0 on success. */
gz_skip(state,len)283 local int gz_skip(state, len)
284 gz_statep state;
285 z_off64_t len;
286 {
287 unsigned n;
288
289 /* skip over len bytes or reach end-of-file, whichever comes first */
290 while (len)
291 /* skip over whatever is in output buffer */
292 if (state->x.have) {
293 n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > len ?
294 (unsigned)len : state->x.have;
295 state->x.have -= n;
296 state->x.next += n;
297 state->x.pos += n;
298 len -= n;
299 }
300
301 /* output buffer empty -- return if we're at the end of the input */
302 else if (state->eof && state->strm.avail_in == 0)
303 break;
304
305 /* need more data to skip -- load up output buffer */
306 else {
307 /* get more output, looking for header if required */
308 if (gz_fetch(state) == -1)
309 return -1;
310 }
311 return 0;
312 }
313
314 /* Read len bytes into buf from file, or less than len up to the end of the
315 input. Return the number of bytes read. If zero is returned, either the
316 end of file was reached, or there was an error. state->err must be
317 consulted in that case to determine which. */
gz_read(state,buf,len)318 local z_size_t gz_read(state, buf, len)
319 gz_statep state;
320 voidp buf;
321 z_size_t len;
322 {
323 z_size_t got;
324 unsigned n;
325
326 /* if len is zero, avoid unnecessary operations */
327 if (len == 0)
328 return 0;
329
330 /* process a skip request */
331 if (state->seek) {
332 state->seek = 0;
333 if (gz_skip(state, state->skip) == -1)
334 return 0;
335 }
336
337 /* get len bytes to buf, or less than len if at the end */
338 got = 0;
339 do {
340 /* set n to the maximum amount of len that fits in an unsigned int */
341 n = -1;
342 if (n > len)
343 n = (unsigned)len;
344
345 /* first just try copying data from the output buffer */
346 if (state->x.have) {
347 if (state->x.have < n)
348 n = state->x.have;
349 memcpy(buf, state->x.next, n);
350 state->x.next += n;
351 state->x.have -= n;
352 }
353
354 /* output buffer empty -- return if we're at the end of the input */
355 else if (state->eof && state->strm.avail_in == 0) {
356 state->past = 1; /* tried to read past end */
357 break;
358 }
359
360 /* need output data -- for small len or new stream load up our output
361 buffer */
362 else if (state->how == LOOK || n < (state->size << 1)) {
363 /* get more output, looking for header if required */
364 if (gz_fetch(state) == -1)
365 return 0;
366 continue; /* no progress yet -- go back to copy above */
367 /* the copy above assures that we will leave with space in the
368 output buffer, allowing at least one gzungetc() to succeed */
369 }
370
371 /* large len -- read directly into user buffer */
372 else if (state->how == COPY) { /* read directly */
373 if (gz_load(state, (unsigned char *)buf, n, &n) == -1)
374 return 0;
375 }
376
377 /* large len -- decompress directly into user buffer */
378 else { /* state->how == GZIP */
379 state->strm.avail_out = n;
380 state->strm.next_out = (unsigned char *)buf;
381 if (gz_decomp(state) == -1)
382 return 0;
383 n = state->x.have;
384 state->x.have = 0;
385 }
386
387 /* update progress */
388 len -= n;
389 buf = (char *)buf + n;
390 got += n;
391 state->x.pos += n;
392 } while (len);
393
394 /* return number of bytes read into user buffer */
395 return got;
396 }
397
398 /* -- see zlib.h -- */
gzread(file,buf,len)399 int ZEXPORT gzread(file, buf, len)
400 gzFile file;
401 voidp buf;
402 unsigned len;
403 {
404 gz_statep state;
405
406 /* get internal structure */
407 if (file == NULL)
408 return -1;
409 state = (gz_statep)file;
410
411 /* check that we're reading and that there's no (serious) error */
412 if (state->mode != GZ_READ ||
413 (state->err != Z_OK && state->err != Z_BUF_ERROR))
414 return -1;
415
416 /* since an int is returned, make sure len fits in one, otherwise return
417 with an error (this avoids a flaw in the interface) */
418 if ((int)len < 0) {
419 gz_error(state, Z_STREAM_ERROR, "request does not fit in an int");
420 return -1;
421 }
422
423 /* read len or fewer bytes to buf */
424 len = (unsigned)gz_read(state, buf, len);
425
426 /* check for an error */
427 if (len == 0 && state->err != Z_OK && state->err != Z_BUF_ERROR)
428 return -1;
429
430 /* return the number of bytes read (this is assured to fit in an int) */
431 return (int)len;
432 }
433
434 /* -- see zlib.h -- */
gzfread(buf,size,nitems,file)435 z_size_t ZEXPORT gzfread(buf, size, nitems, file)
436 voidp buf;
437 z_size_t size;
438 z_size_t nitems;
439 gzFile file;
440 {
441 z_size_t len;
442 gz_statep state;
443
444 /* get internal structure */
445 if (file == NULL)
446 return 0;
447 state = (gz_statep)file;
448
449 /* check that we're reading and that there's no (serious) error */
450 if (state->mode != GZ_READ ||
451 (state->err != Z_OK && state->err != Z_BUF_ERROR))
452 return 0;
453
454 /* compute bytes to read -- error on overflow */
455 len = nitems * size;
456 if (size && len / size != nitems) {
457 gz_error(state, Z_STREAM_ERROR, "request does not fit in a size_t");
458 return 0;
459 }
460
461 /* read len or fewer bytes to buf, return the number of full items read */
462 return len ? gz_read(state, buf, len) / size : 0;
463 }
464
465 /* -- see zlib.h -- */
466 #ifdef Z_PREFIX_SET
467 # undef z_gzgetc
468 #else
469 # undef gzgetc
470 #endif
gzgetc(file)471 int ZEXPORT gzgetc(file)
472 gzFile file;
473 {
474 int ret;
475 unsigned char buf[1];
476 gz_statep state;
477
478 /* get internal structure */
479 if (file == NULL)
480 return -1;
481 state = (gz_statep)file;
482
483 /* check that we're reading and that there's no (serious) error */
484 if (state->mode != GZ_READ ||
485 (state->err != Z_OK && state->err != Z_BUF_ERROR))
486 return -1;
487
488 /* try output buffer (no need to check for skip request) */
489 if (state->x.have) {
490 state->x.have--;
491 state->x.pos++;
492 return *(state->x.next)++;
493 }
494
495 /* nothing there -- try gz_read() */
496 ret = (int)gz_read(state, buf, 1);
497 return ret < 1 ? -1 : buf[0];
498 }
499
gzgetc_(file)500 int ZEXPORT gzgetc_(file)
501 gzFile file;
502 {
503 return gzgetc(file);
504 }
505
506 /* -- see zlib.h -- */
gzungetc(c,file)507 int ZEXPORT gzungetc(c, file)
508 int c;
509 gzFile file;
510 {
511 gz_statep state;
512
513 /* get internal structure */
514 if (file == NULL)
515 return -1;
516 state = (gz_statep)file;
517
518 /* check that we're reading and that there's no (serious) error */
519 if (state->mode != GZ_READ ||
520 (state->err != Z_OK && state->err != Z_BUF_ERROR))
521 return -1;
522
523 /* process a skip request */
524 if (state->seek) {
525 state->seek = 0;
526 if (gz_skip(state, state->skip) == -1)
527 return -1;
528 }
529
530 /* can't push EOF */
531 if (c < 0)
532 return -1;
533
534 /* if output buffer empty, put byte at end (allows more pushing) */
535 if (state->x.have == 0) {
536 state->x.have = 1;
537 state->x.next = state->out + (state->size << 1) - 1;
538 state->x.next[0] = (unsigned char)c;
539 state->x.pos--;
540 state->past = 0;
541 return c;
542 }
543
544 /* if no room, give up (must have already done a gzungetc()) */
545 if (state->x.have == (state->size << 1)) {
546 gz_error(state, Z_DATA_ERROR, "out of room to push characters");
547 return -1;
548 }
549
550 /* slide output data if needed and insert byte before existing data */
551 if (state->x.next == state->out) {
552 unsigned char *src = state->out + state->x.have;
553 unsigned char *dest = state->out + (state->size << 1);
554 while (src > state->out)
555 *--dest = *--src;
556 state->x.next = dest;
557 }
558 state->x.have++;
559 state->x.next--;
560 state->x.next[0] = (unsigned char)c;
561 state->x.pos--;
562 state->past = 0;
563 return c;
564 }
565
566 /* -- see zlib.h -- */
gzgets(file,buf,len)567 char * ZEXPORT gzgets(file, buf, len)
568 gzFile file;
569 char *buf;
570 int len;
571 {
572 unsigned left, n;
573 char *str;
574 unsigned char *eol;
575 gz_statep state;
576
577 /* check parameters and get internal structure */
578 if (file == NULL || buf == NULL || len < 1)
579 return NULL;
580 state = (gz_statep)file;
581
582 /* check that we're reading and that there's no (serious) error */
583 if (state->mode != GZ_READ ||
584 (state->err != Z_OK && state->err != Z_BUF_ERROR))
585 return NULL;
586
587 /* process a skip request */
588 if (state->seek) {
589 state->seek = 0;
590 if (gz_skip(state, state->skip) == -1)
591 return NULL;
592 }
593
594 /* copy output bytes up to new line or len - 1, whichever comes first --
595 append a terminating zero to the string (we don't check for a zero in
596 the contents, let the user worry about that) */
597 str = buf;
598 left = (unsigned)len - 1;
599 if (left) do {
600 /* assure that something is in the output buffer */
601 if (state->x.have == 0 && gz_fetch(state) == -1)
602 return NULL; /* error */
603 if (state->x.have == 0) { /* end of file */
604 state->past = 1; /* read past end */
605 break; /* return what we have */
606 }
607
608 /* look for end-of-line in current output buffer */
609 n = state->x.have > left ? left : state->x.have;
610 eol = (unsigned char *)memchr(state->x.next, '\n', n);
611 if (eol != NULL)
612 n = (unsigned)(eol - state->x.next) + 1;
613
614 /* copy through end-of-line, or remainder if not found */
615 memcpy(buf, state->x.next, n);
616 state->x.have -= n;
617 state->x.next += n;
618 state->x.pos += n;
619 left -= n;
620 buf += n;
621 } while (left && eol == NULL);
622
623 /* return terminated string, or if nothing, end of file */
624 if (buf == str)
625 return NULL;
626 buf[0] = 0;
627 return str;
628 }
629
630 /* -- see zlib.h -- */
gzdirect(file)631 int ZEXPORT gzdirect(file)
632 gzFile file;
633 {
634 gz_statep state;
635
636 /* get internal structure */
637 if (file == NULL)
638 return 0;
639 state = (gz_statep)file;
640
641 /* if the state is not known, but we can find out, then do so (this is
642 mainly for right after a gzopen() or gzdopen()) */
643 if (state->mode == GZ_READ && state->how == LOOK && state->x.have == 0)
644 (void)gz_look(state);
645
646 /* return 1 if transparent, 0 if processing a gzip stream */
647 return state->direct;
648 }
649
650 /* -- see zlib.h -- */
gzclose_r(file)651 int ZEXPORT gzclose_r(file)
652 gzFile file;
653 {
654 int ret, err;
655 gz_statep state;
656
657 /* get internal structure */
658 if (file == NULL)
659 return Z_STREAM_ERROR;
660 state = (gz_statep)file;
661
662 /* check that we're reading */
663 if (state->mode != GZ_READ)
664 return Z_STREAM_ERROR;
665
666 /* free memory and close file */
667 if (state->size) {
668 inflateEnd(&(state->strm));
669 free(state->out);
670 free(state->in);
671 }
672 err = state->err == Z_BUF_ERROR ? Z_BUF_ERROR : Z_OK;
673 gz_error(state, Z_OK, NULL);
674 free(state->path);
675 ret = close(state->fd);
676 free(state);
677 return ret ? Z_ERRNO : err;
678 }
679