Merge "Just use fstat in sysMapFile."

This commit is contained in:
Elliott Hughes
2015-06-24 00:34:45 +00:00
committed by Gerrit Code Review
3 changed files with 26 additions and 73 deletions

View File

@@ -18,6 +18,6 @@ LOCAL_MODULE := libminzip
LOCAL_CLANG := true LOCAL_CLANG := true
LOCAL_CFLAGS += -Wall LOCAL_CFLAGS += -Werror -Wall
include $(BUILD_STATIC_LIBRARY) include $(BUILD_STATIC_LIBRARY)

View File

@@ -3,86 +3,46 @@
* *
* System utilities. * System utilities.
*/ */
#include <stdlib.h> #include <assert.h>
#include <stdio.h> #include <errno.h>
#include <unistd.h>
#include <string.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> #include <fcntl.h>
#include <limits.h> #include <limits.h>
#include <errno.h> #include <stdbool.h>
#include <assert.h> #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#define LOG_TAG "sysutil" #define LOG_TAG "sysutil"
#include "Log.h" #include "Log.h"
#include "SysUtil.h" #include "SysUtil.h"
static int getFileStartAndLength(int fd, off_t *start_, size_t *length_) static bool sysMapFD(int fd, MemMapping* pMap) {
{
off_t start, end;
size_t length;
assert(start_ != NULL);
assert(length_ != NULL);
// TODO: isn't start always 0 for the single call site? just use fstat instead?
start = TEMP_FAILURE_RETRY(lseek(fd, 0L, SEEK_CUR));
end = TEMP_FAILURE_RETRY(lseek(fd, 0L, SEEK_END));
if (TEMP_FAILURE_RETRY(lseek(fd, start, SEEK_SET)) == -1 ||
start == (off_t) -1 || end == (off_t) -1) {
LOGE("could not determine length of file\n");
return -1;
}
length = end - start;
if (length == 0) {
LOGE("file is empty\n");
return -1;
}
*start_ = start;
*length_ = length;
return 0;
}
/*
* Map a file (from fd's current offset) into a private, read-only memory
* segment. The file offset must be a multiple of the page size.
*
* On success, returns 0 and fills out "pMap". On failure, returns a nonzero
* value and does not disturb "pMap".
*/
static int sysMapFD(int fd, MemMapping* pMap)
{
off_t start;
size_t length;
void* memPtr;
assert(pMap != NULL); assert(pMap != NULL);
if (getFileStartAndLength(fd, &start, &length) < 0) struct stat sb;
return -1; if (fstat(fd, &sb) == -1) {
LOGW("fstat(%d) failed: %s\n", fd, strerror(errno));
return false;
}
memPtr = mmap(NULL, length, PROT_READ, MAP_PRIVATE, fd, start); void* memPtr = mmap(NULL, sb.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
if (memPtr == MAP_FAILED) { if (memPtr == MAP_FAILED) {
LOGW("mmap(%d, R, PRIVATE, %d, %d) failed: %s\n", (int) length, LOGW("mmap(%d, R, PRIVATE, %d, 0) failed: %s\n", (int) sb.st_size, fd, strerror(errno));
fd, (int) start, strerror(errno)); return false;
return -1;
} }
pMap->addr = memPtr; pMap->addr = memPtr;
pMap->length = length; pMap->length = sb.st_size;
pMap->range_count = 1; pMap->range_count = 1;
pMap->ranges = malloc(sizeof(MappedRange)); pMap->ranges = malloc(sizeof(MappedRange));
pMap->ranges[0].addr = memPtr; pMap->ranges[0].addr = memPtr;
pMap->ranges[0].length = length; pMap->ranges[0].length = sb.st_size;
return 0; return true;
} }
static int sysMapBlockFile(FILE* mapf, MemMapping* pMap) static int sysMapBlockFile(FILE* mapf, MemMapping* pMap)
@@ -180,13 +140,13 @@ int sysMapFile(const char* fn, MemMapping* pMap)
fclose(mapf); fclose(mapf);
} else { } else {
// This is a regular file. // This is a regular file.
int fd = open(fn, O_RDONLY, 0); int fd = open(fn, O_RDONLY);
if (fd < 0) { if (fd == -1) {
LOGE("Unable to open '%s': %s\n", fn, strerror(errno)); LOGE("Unable to open '%s': %s\n", fn, strerror(errno));
return -1; return -1;
} }
if (sysMapFD(fd, pMap) != 0) { if (!sysMapFD(fd, pMap)) {
LOGE("Map of '%s' failed\n", fn); LOGE("Map of '%s' failed\n", fn);
close(fd); close(fd);
return -1; return -1;

View File

@@ -619,13 +619,6 @@ bool mzProcessZipEntryContents(const ZipArchive *pArchive,
return ret; return ret;
} }
static bool crcProcessFunction(const unsigned char *data, int dataLen,
void *crc)
{
*(unsigned long *)crc = crc32(*(unsigned long *)crc, data, dataLen);
return true;
}
typedef struct { typedef struct {
char *buf; char *buf;
int bufLen; int bufLen;