forked from openkylin/platform_build
Merge "zipalign: remove support for adding members from gzip sources." am: 96a4bdd9a6
am: 080f68acf5
am: 8778583000
Change-Id: Ia3660fbc47245e63537b534028e8984c06459973
This commit is contained in:
commit
6e5855f9ed
|
@ -359,8 +359,7 @@ bail:
|
||||||
* safely written. Not really a concern for us.
|
* safely written. Not really a concern for us.
|
||||||
*/
|
*/
|
||||||
status_t ZipFile::addCommon(const char* fileName, const void* data, size_t size,
|
status_t ZipFile::addCommon(const char* fileName, const void* data, size_t size,
|
||||||
const char* storageName, int sourceType, int compressionMethod,
|
const char* storageName, int compressionMethod, ZipEntry** ppEntry)
|
||||||
ZipEntry** ppEntry)
|
|
||||||
{
|
{
|
||||||
ZipEntry* pEntry = NULL;
|
ZipEntry* pEntry = NULL;
|
||||||
status_t result = NO_ERROR;
|
status_t result = NO_ERROR;
|
||||||
|
@ -414,81 +413,51 @@ status_t ZipFile::addCommon(const char* fileName, const void* data, size_t size,
|
||||||
/*
|
/*
|
||||||
* Copy the data in, possibly compressing it as we go.
|
* Copy the data in, possibly compressing it as we go.
|
||||||
*/
|
*/
|
||||||
if (sourceType == ZipEntry::kCompressStored) {
|
if (compressionMethod == ZipEntry::kCompressDeflated) {
|
||||||
if (compressionMethod == ZipEntry::kCompressDeflated) {
|
bool failed = false;
|
||||||
bool failed = false;
|
result = compressFpToFp(mZipFp, inputFp, data, size, &crc);
|
||||||
result = compressFpToFp(mZipFp, inputFp, data, size, &crc);
|
|
||||||
if (result != NO_ERROR) {
|
|
||||||
ALOGD("compression failed, storing\n");
|
|
||||||
failed = true;
|
|
||||||
} else {
|
|
||||||
/*
|
|
||||||
* Make sure it has compressed "enough". This probably ought
|
|
||||||
* to be set through an API call, but I don't expect our
|
|
||||||
* criteria to change over time.
|
|
||||||
*/
|
|
||||||
long src = inputFp ? ftell(inputFp) : size;
|
|
||||||
long dst = ftell(mZipFp) - startPosn;
|
|
||||||
if (dst + (dst / 10) > src) {
|
|
||||||
ALOGD("insufficient compression (src=%ld dst=%ld), storing\n",
|
|
||||||
src, dst);
|
|
||||||
failed = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (failed) {
|
|
||||||
compressionMethod = ZipEntry::kCompressStored;
|
|
||||||
if (inputFp) rewind(inputFp);
|
|
||||||
fseek(mZipFp, startPosn, SEEK_SET);
|
|
||||||
/* fall through to kCompressStored case */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* handle "no compression" request, or failed compression from above */
|
|
||||||
if (compressionMethod == ZipEntry::kCompressStored) {
|
|
||||||
if (inputFp) {
|
|
||||||
result = copyFpToFp(mZipFp, inputFp, &crc);
|
|
||||||
} else {
|
|
||||||
result = copyDataToFp(mZipFp, data, size, &crc);
|
|
||||||
}
|
|
||||||
if (result != NO_ERROR) {
|
|
||||||
// don't need to truncate; happens in CDE rewrite
|
|
||||||
ALOGD("failed copying data in\n");
|
|
||||||
goto bail;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// currently seeked to end of file
|
|
||||||
uncompressedLen = inputFp ? ftell(inputFp) : size;
|
|
||||||
} else if (sourceType == ZipEntry::kCompressDeflated) {
|
|
||||||
/* we should support uncompressed-from-compressed, but it's not
|
|
||||||
* important right now */
|
|
||||||
assert(compressionMethod == ZipEntry::kCompressDeflated);
|
|
||||||
|
|
||||||
bool scanResult;
|
|
||||||
int method;
|
|
||||||
long compressedLen;
|
|
||||||
unsigned long longcrc;
|
|
||||||
|
|
||||||
scanResult = ZipUtils::examineGzip(inputFp, &method, &uncompressedLen,
|
|
||||||
&compressedLen, &longcrc);
|
|
||||||
if (!scanResult || method != ZipEntry::kCompressDeflated) {
|
|
||||||
ALOGD("this isn't a deflated gzip file?");
|
|
||||||
result = UNKNOWN_ERROR;
|
|
||||||
goto bail;
|
|
||||||
}
|
|
||||||
crc = longcrc;
|
|
||||||
|
|
||||||
result = copyPartialFpToFp(mZipFp, inputFp, compressedLen, NULL);
|
|
||||||
if (result != NO_ERROR) {
|
if (result != NO_ERROR) {
|
||||||
ALOGD("failed copying gzip data in\n");
|
ALOGD("compression failed, storing\n");
|
||||||
|
failed = true;
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
* Make sure it has compressed "enough". This probably ought
|
||||||
|
* to be set through an API call, but I don't expect our
|
||||||
|
* criteria to change over time.
|
||||||
|
*/
|
||||||
|
long src = inputFp ? ftell(inputFp) : size;
|
||||||
|
long dst = ftell(mZipFp) - startPosn;
|
||||||
|
if (dst + (dst / 10) > src) {
|
||||||
|
ALOGD("insufficient compression (src=%ld dst=%ld), storing\n",
|
||||||
|
src, dst);
|
||||||
|
failed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (failed) {
|
||||||
|
compressionMethod = ZipEntry::kCompressStored;
|
||||||
|
if (inputFp) rewind(inputFp);
|
||||||
|
fseek(mZipFp, startPosn, SEEK_SET);
|
||||||
|
/* fall through to kCompressStored case */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* handle "no compression" request, or failed compression from above */
|
||||||
|
if (compressionMethod == ZipEntry::kCompressStored) {
|
||||||
|
if (inputFp) {
|
||||||
|
result = copyFpToFp(mZipFp, inputFp, &crc);
|
||||||
|
} else {
|
||||||
|
result = copyDataToFp(mZipFp, data, size, &crc);
|
||||||
|
}
|
||||||
|
if (result != NO_ERROR) {
|
||||||
|
// don't need to truncate; happens in CDE rewrite
|
||||||
|
ALOGD("failed copying data in\n");
|
||||||
goto bail;
|
goto bail;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
assert(false);
|
|
||||||
result = UNKNOWN_ERROR;
|
|
||||||
goto bail;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// currently seeked to end of file
|
||||||
|
uncompressedLen = inputFp ? ftell(inputFp) : size;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We could write the "Data Descriptor", but there doesn't seem to
|
* We could write the "Data Descriptor", but there doesn't seem to
|
||||||
* be any point since we're going to go back and write the LFH.
|
* be any point since we're going to go back and write the LFH.
|
||||||
|
|
|
@ -86,23 +86,9 @@ public:
|
||||||
int compressionMethod, ZipEntry** ppEntry)
|
int compressionMethod, ZipEntry** ppEntry)
|
||||||
{
|
{
|
||||||
return addCommon(fileName, NULL, 0, storageName,
|
return addCommon(fileName, NULL, 0, storageName,
|
||||||
ZipEntry::kCompressStored,
|
|
||||||
compressionMethod, ppEntry);
|
compressionMethod, ppEntry);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Add a file that is already compressed with gzip.
|
|
||||||
*
|
|
||||||
* If "ppEntry" is non-NULL, a pointer to the new entry will be returned.
|
|
||||||
*/
|
|
||||||
status_t addGzip(const char* fileName, const char* storageName,
|
|
||||||
ZipEntry** ppEntry)
|
|
||||||
{
|
|
||||||
return addCommon(fileName, NULL, 0, storageName,
|
|
||||||
ZipEntry::kCompressDeflated,
|
|
||||||
ZipEntry::kCompressDeflated, ppEntry);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Add a file from an in-memory data buffer.
|
* Add a file from an in-memory data buffer.
|
||||||
*
|
*
|
||||||
|
@ -112,7 +98,6 @@ public:
|
||||||
int compressionMethod, ZipEntry** ppEntry)
|
int compressionMethod, ZipEntry** ppEntry)
|
||||||
{
|
{
|
||||||
return addCommon(NULL, data, size, storageName,
|
return addCommon(NULL, data, size, storageName,
|
||||||
ZipEntry::kCompressStored,
|
|
||||||
compressionMethod, ppEntry);
|
compressionMethod, ppEntry);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -231,8 +216,7 @@ private:
|
||||||
|
|
||||||
/* common handler for all "add" functions */
|
/* common handler for all "add" functions */
|
||||||
status_t addCommon(const char* fileName, const void* data, size_t size,
|
status_t addCommon(const char* fileName, const void* data, size_t size,
|
||||||
const char* storageName, int sourceType, int compressionMethod,
|
const char* storageName, int compressionMethod, ZipEntry** ppEntry);
|
||||||
ZipEntry** ppEntry);
|
|
||||||
|
|
||||||
/* copy all of "srcFp" into "dstFp" */
|
/* copy all of "srcFp" into "dstFp" */
|
||||||
status_t copyFpToFp(FILE* dstFp, FILE* srcFp, uint32_t* pCRC32);
|
status_t copyFpToFp(FILE* dstFp, FILE* srcFp, uint32_t* pCRC32);
|
||||||
|
|
Loading…
Reference in New Issue