Add locking around ZIP seeking
Since we switched to seeking to the LFH to verify its existence instead of a huge mmap of the file, we have to guarantee that another seek doesn't happen before we finish our read on the LFH. Change-Id: If8135d9cb6f2f5cc4db734eafa4f6b5f6269c62a
This commit is contained in:
parent
d18051870e
commit
f7c1be0e62
|
@ -24,8 +24,9 @@
|
|||
#ifndef __LIBS_ZIPFILERO_H
|
||||
#define __LIBS_ZIPFILERO_H
|
||||
|
||||
#include "Errors.h"
|
||||
#include "FileMap.h"
|
||||
#include <utils/Errors.h>
|
||||
#include <utils/FileMap.h>
|
||||
#include <utils/threads.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
@ -211,6 +212,9 @@ private:
|
|||
/* open Zip archive */
|
||||
int mFd;
|
||||
|
||||
/* Lock for handling the file descriptor (seeks, etc) */
|
||||
mutable Mutex mFdLock;
|
||||
|
||||
/* zip file name */
|
||||
char* mFileName;
|
||||
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
#include <utils/ZipFileRO.h>
|
||||
#include <utils/Log.h>
|
||||
#include <utils/misc.h>
|
||||
#include <utils/threads.h>
|
||||
|
||||
#include <zlib.h>
|
||||
|
||||
|
@ -195,7 +196,7 @@ bool ZipFileRO::mapCentralDirectory(void)
|
|||
free(scanBuf);
|
||||
return false;
|
||||
} else if (header != kLFHSignature) {
|
||||
LOGV("Not a Zip archive (found 0x%08x)\n", val);
|
||||
LOGV("Not a Zip archive (found 0x%08x)\n", header);
|
||||
free(scanBuf);
|
||||
return false;
|
||||
}
|
||||
|
@ -496,15 +497,21 @@ bool ZipFileRO::getEntryInfo(ZipEntryRO entry, int* pMethod, size_t* pUncompLen,
|
|||
}
|
||||
|
||||
unsigned char lfhBuf[kLFHLen];
|
||||
if (lseek(mFd, localHdrOffset, SEEK_SET) != localHdrOffset) {
|
||||
LOGW("failed seeking to lfh at offset %ld\n", localHdrOffset);
|
||||
return false;
|
||||
}
|
||||
ssize_t actual =
|
||||
TEMP_FAILURE_RETRY(read(mFd, lfhBuf, sizeof(lfhBuf)));
|
||||
if (actual != sizeof(lfhBuf)) {
|
||||
LOGW("failed reading lfh from offset %ld\n", localHdrOffset);
|
||||
return false;
|
||||
|
||||
{
|
||||
AutoMutex _l(mFdLock);
|
||||
|
||||
if (lseek(mFd, localHdrOffset, SEEK_SET) != localHdrOffset) {
|
||||
LOGW("failed seeking to lfh at offset %ld\n", localHdrOffset);
|
||||
return false;
|
||||
}
|
||||
|
||||
ssize_t actual =
|
||||
TEMP_FAILURE_RETRY(read(mFd, lfhBuf, sizeof(lfhBuf)));
|
||||
if (actual != sizeof(lfhBuf)) {
|
||||
LOGW("failed reading lfh from offset %ld\n", localHdrOffset);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (get4LE(lfhBuf) != kLFHSignature) {
|
||||
|
|
Loading…
Reference in New Issue