1579 }
1580 break;
1581 case Z_DATA_ERROR:
1582 *pmsg = "INFLATER_inflateFully: Compressed data corrupted";
1583 inflateEnd(&strm);
1584 return JNI_FALSE;
1585 case Z_MEM_ERROR:
1586 *pmsg = "INFLATER_inflateFully: out of memory";
1587 inflateEnd(&strm);
1588 return JNI_FALSE;
1589 default:
1590 *pmsg = "INFLATER_inflateFully: internal error";
1591 inflateEnd(&strm);
1592 return JNI_FALSE;
1593 }
1594 } while (strm.avail_in > 0);
1595
1596 inflateEnd(&strm);
1597 return JNI_TRUE;
1598 }
|
1579 }
1580 break;
1581 case Z_DATA_ERROR:
1582 *pmsg = "INFLATER_inflateFully: Compressed data corrupted";
1583 inflateEnd(&strm);
1584 return JNI_FALSE;
1585 case Z_MEM_ERROR:
1586 *pmsg = "INFLATER_inflateFully: out of memory";
1587 inflateEnd(&strm);
1588 return JNI_FALSE;
1589 default:
1590 *pmsg = "INFLATER_inflateFully: internal error";
1591 inflateEnd(&strm);
1592 return JNI_FALSE;
1593 }
1594 } while (strm.avail_in > 0);
1595
1596 inflateEnd(&strm);
1597 return JNI_TRUE;
1598 }
1599
1600 static voidpf tracking_zlib_alloc(voidpf opaque, uInt items, uInt size) {
1601 size_t* needed = (size_t*) opaque;
1602 *needed += (size_t) items * (size_t) size;
1603 return (voidpf) calloc((size_t) items, (size_t) size);
1604 }
1605
1606 static void tracking_zlib_free(voidpf opaque, voidpf address) {
1607 free((void*) address);
1608 }
1609
1610 static voidpf zlib_block_alloc(voidpf opaque, uInt items, uInt size) {
1611 char** range = (char**) opaque;
1612 voidpf result = NULL;
1613 size_t needed = (size_t) items * (size_t) size;
1614
1615 if (range[1] - range[0] >= (ptrdiff_t) needed) {
1616 result = (voidpf) range[0];
1617 range[0] += needed;
1618 }
1619
1620 return result;
1621 }
1622
1623 static void zlib_block_free(voidpf opaque, voidpf address) {
1624 /* Nothing to do. */
1625 }
1626
1627 static char const* deflateInit2Wrapper(z_stream* strm, int level) {
1628 int err = deflateInit2(strm, level >= 0 && level <= 9 ? level : Z_DEFAULT_COMPRESSION,
1629 Z_DEFLATED, 31, 8, Z_DEFAULT_STRATEGY);
1630 if (err == Z_MEM_ERROR) {
1631 return "Out of memory in deflateInit2";
1632 }
1633
1634 if (err != Z_OK) {
1635 return "Internal error in deflateInit2";
1636 }
1637
1638 return NULL;
1639 }
1640
1641 JNIEXPORT char const*
1642 ZIP_GZip_InitParams(size_t inLen, size_t* outLen, size_t* tmpLen, int level) {
1643 z_stream strm;
1644 *tmpLen = 0;
1645 char const* errorMsg;
1646
1647 memset(&strm, 0, sizeof(z_stream));
1648 strm.zalloc = tracking_zlib_alloc;
1649 strm.zfree = tracking_zlib_free;
1650 strm.opaque = (voidpf) tmpLen;
1651
1652 errorMsg = deflateInit2Wrapper(&strm, level);
1653
1654 if (errorMsg == NULL) {
1655 *outLen = (size_t) deflateBound(&strm, (uLong) inLen);
1656 deflateEnd(&strm);
1657 }
1658
1659 return errorMsg;
1660 }
1661
1662 JNIEXPORT size_t
1663 ZIP_GZip_Fully(char* inBuf, size_t inLen, char* outBuf, size_t outLen, char* tmp, size_t tmpLen,
1664 int level, char* comment, char const** pmsg) {
1665 z_stream strm;
1666 gz_header hdr;
1667 int err;
1668 char* block[] = {tmp, tmpLen + tmp};
1669 size_t result = 0;
1670
1671 memset(&strm, 0, sizeof(z_stream));
1672 strm.zalloc = zlib_block_alloc;
1673 strm.zfree = zlib_block_free;
1674 strm.opaque = (voidpf) block;
1675
1676 *pmsg = deflateInit2Wrapper(&strm, level);
1677
1678 if (*pmsg == NULL) {
1679 strm.next_out = (Bytef *) outBuf;
1680 strm.avail_out = (uInt) outLen;
1681 strm.next_in = (Bytef *) inBuf;
1682 strm.avail_in = (uInt) inLen;
1683
1684 if (comment != NULL) {
1685 memset(&hdr, 0, sizeof(hdr));
1686 hdr.comment = (Bytef*) comment;
1687 deflateSetHeader(&strm, &hdr);
1688 }
1689
1690 err = deflate(&strm, Z_FINISH);
1691
1692 if (err == Z_OK || err == Z_BUF_ERROR) {
1693 *pmsg = "Buffer too small";
1694 } else if (err != Z_STREAM_END) {
1695 *pmsg = "Intern deflate error";
1696 } else {
1697 result = (size_t) strm.total_out;
1698 }
1699
1700 deflateEnd(&strm);
1701 }
1702
1703 return result;
1704 }
|