Annotation of embedaddon/php/ext/zip/lib/zip_fread.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:   zip_fread.c -- read from file
                      3:   Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner
                      4: 
                      5:   This file is part of libzip, a library to manipulate ZIP archives.
                      6:   The authors can be contacted at <libzip@nih.at>
                      7: 
                      8:   Redistribution and use in source and binary forms, with or without
                      9:   modification, are permitted provided that the following conditions
                     10:   are met:
                     11:   1. Redistributions of source code must retain the above copyright
                     12:      notice, this list of conditions and the following disclaimer.
                     13:   2. Redistributions in binary form must reproduce the above copyright
                     14:      notice, this list of conditions and the following disclaimer in
                     15:      the documentation and/or other materials provided with the
                     16:      distribution.
                     17:   3. The names of the authors may not be used to endorse or promote
                     18:      products derived from this software without specific prior
                     19:      written permission.
                     20:  
                     21:   THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
                     22:   OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
                     23:   WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     24:   ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
                     25:   DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     26:   DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
                     27:   GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
                     28:   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
                     29:   IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
                     30:   OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
                     31:   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
                     32: */
                     33: 
                     34: 
                     35: 
                     36: #include "zipint.h"
                     37: 
                     38: 
                     39: 
                     40: ZIP_EXTERN(ssize_t)
                     41: zip_fread(struct zip_file *zf, void *outbuf, size_t toread)
                     42: {
                     43:     int ret;
                     44:        size_t out_before, len;
                     45:     int i;
                     46: 
                     47:     if (!zf)
                     48:        return -1;
                     49: 
                     50:     if (zf->error.zip_err != 0)
                     51:        return -1;
                     52: 
                     53:     if ((zf->flags & ZIP_ZF_EOF) || (toread == 0))
                     54:        return 0;
                     55: 
                     56:     if (zf->bytes_left == 0) {
                     57:        zf->flags |= ZIP_ZF_EOF;
                     58:        if (zf->flags & ZIP_ZF_CRC) {
                     59:            if (zf->crc != zf->crc_orig) {
                     60:                _zip_error_set(&zf->error, ZIP_ER_CRC, 0);
                     61:                return -1;
                     62:            }
                     63:        }
                     64:        return 0;
                     65:     }
                     66: 
                     67:     if ((zf->flags & ZIP_ZF_DECOMP) == 0) {
                     68:        ret = _zip_file_fillbuf(outbuf, toread, zf);
                     69:        if (ret > 0) {
                     70:            if (zf->flags & ZIP_ZF_CRC)
                     71:                zf->crc = crc32(zf->crc, (Bytef *)outbuf, ret);
                     72:            zf->bytes_left -= ret;
                     73:        }
                     74:        return ret;
                     75:     }
                     76:     
                     77:     zf->zstr->next_out = (Bytef *)outbuf;
                     78:     zf->zstr->avail_out = toread;
                     79:     out_before = zf->zstr->total_out;
                     80:     
                     81:     /* endless loop until something has been accomplished */
                     82:     for (;;) {
                     83:        ret = inflate(zf->zstr, Z_SYNC_FLUSH);
                     84: 
                     85:        switch (ret) {
                     86:        case Z_STREAM_END:
                     87:            if (zf->zstr->total_out == out_before) {
                     88:                if (zf->crc != zf->crc_orig) {
                     89:                    _zip_error_set(&zf->error, ZIP_ER_CRC, 0);
                     90:                    return -1;
                     91:                }
                     92:                else
                     93:                    return 0;
                     94:            }
                     95: 
                     96:            /* fallthrough */
                     97: 
                     98:        case Z_OK:
                     99:            len = zf->zstr->total_out - out_before;
                    100:            if (len >= zf->bytes_left || len >= toread) {
                    101:                if (zf->flags & ZIP_ZF_CRC)
                    102:                    zf->crc = crc32(zf->crc, (Bytef *)outbuf, len);
                    103:                zf->bytes_left -= len;
                    104:                return len;
                    105:            }
                    106:            break;
                    107: 
                    108:        case Z_BUF_ERROR:
                    109:            if (zf->zstr->avail_in == 0) {
                    110:                i = _zip_file_fillbuf(zf->buffer, BUFSIZE, zf);
                    111:                if (i == 0) {
                    112:                    _zip_error_set(&zf->error, ZIP_ER_INCONS, 0);
                    113:                    return -1;
                    114:                }
                    115:                else if (i < 0)
                    116:                    return -1;
                    117:                zf->zstr->next_in = (Bytef *)zf->buffer;
                    118:                zf->zstr->avail_in = i;
                    119:                continue;
                    120:            }
                    121:            /* fallthrough */
                    122:        case Z_NEED_DICT:
                    123:        case Z_DATA_ERROR:
                    124:        case Z_STREAM_ERROR:
                    125:        case Z_MEM_ERROR:
                    126:            _zip_error_set(&zf->error, ZIP_ER_ZLIB, ret);
                    127:            return -1;
                    128:        }
                    129:     }
                    130: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>