* commit 'ed8ce08600c8b166aa53ac2197c5b3e3692ade41': Prevent unaligned read in libziparchive.
This commit is contained in:
commit
9bbd0a5c92
2 changed files with 21 additions and 22 deletions
|
@ -21,7 +21,7 @@ include $(CLEAR_VARS)
|
|||
LOCAL_CPP_EXTENSION := .cc
|
||||
LOCAL_SRC_FILES := ${source_files}
|
||||
LOCAL_STATIC_LIBRARIES := libz
|
||||
LOCAL_SHARED_LIBRARIES := libutils
|
||||
LOCAL_SHARED_LIBRARIES := libutils libbase
|
||||
LOCAL_MODULE:= libziparchive
|
||||
LOCAL_CFLAGS := -Werror -Wall
|
||||
LOCAL_CPPFLAGS := -Wold-style-cast
|
||||
|
@ -30,7 +30,7 @@ include $(BUILD_STATIC_LIBRARY)
|
|||
include $(CLEAR_VARS)
|
||||
LOCAL_CPP_EXTENSION := .cc
|
||||
LOCAL_SRC_FILES := ${source_files}
|
||||
LOCAL_STATIC_LIBRARIES := libz libutils
|
||||
LOCAL_STATIC_LIBRARIES := libz libutils libbase
|
||||
LOCAL_MODULE:= libziparchive-host
|
||||
LOCAL_CFLAGS := -Werror
|
||||
ifneq ($(strip $(USE_MINGW)),)
|
||||
|
@ -43,7 +43,7 @@ include $(CLEAR_VARS)
|
|||
LOCAL_CPP_EXTENSION := .cc
|
||||
LOCAL_SRC_FILES := ${source_files}
|
||||
LOCAL_STATIC_LIBRARIES := libz libutils
|
||||
LOCAL_SHARED_LIBRARIES := liblog
|
||||
LOCAL_SHARED_LIBRARIES := liblog libbase
|
||||
LOCAL_MODULE:= libziparchive-host
|
||||
LOCAL_CFLAGS := -Werror
|
||||
LOCAL_MULTILIB := both
|
||||
|
@ -55,7 +55,7 @@ LOCAL_MODULE := ziparchive-tests
|
|||
LOCAL_CPP_EXTENSION := .cc
|
||||
LOCAL_CFLAGS := -Werror
|
||||
LOCAL_SRC_FILES := zip_archive_test.cc entry_name_utils_test.cc
|
||||
LOCAL_SHARED_LIBRARIES := liblog
|
||||
LOCAL_SHARED_LIBRARIES := liblog libbase
|
||||
LOCAL_STATIC_LIBRARIES := libziparchive libz libutils
|
||||
include $(BUILD_NATIVE_TEST)
|
||||
|
||||
|
@ -66,7 +66,7 @@ LOCAL_CFLAGS += \
|
|||
-Werror \
|
||||
-Wno-unnamed-type-template-args
|
||||
LOCAL_SRC_FILES := zip_archive_test.cc entry_name_utils_test.cc
|
||||
LOCAL_SHARED_LIBRARIES := libziparchive-host liblog
|
||||
LOCAL_SHARED_LIBRARIES := libziparchive-host liblog libbase
|
||||
LOCAL_STATIC_LIBRARIES := \
|
||||
libz \
|
||||
libutils
|
||||
|
|
|
@ -18,27 +18,29 @@
|
|||
* Read-only access to Zip archives, with minimal heap allocation.
|
||||
*/
|
||||
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
|
||||
#include <assert.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <inttypes.h>
|
||||
#include <limits.h>
|
||||
#include <log/log.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <utils/Compat.h>
|
||||
#include <utils/FileMap.h>
|
||||
#include <zlib.h>
|
||||
|
||||
#include <JNIHelp.h> // TEMP_FAILURE_RETRY may or may not be in unistd
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
|
||||
#include "base/macros.h" // TEMP_FAILURE_RETRY may or may not be in unistd
|
||||
#include "base/memory.h"
|
||||
#include "log/log.h"
|
||||
#include "utils/Compat.h"
|
||||
#include "utils/FileMap.h"
|
||||
#include "zlib.h"
|
||||
|
||||
#include "entry_name_utils-inl.h"
|
||||
#include "ziparchive/zip_archive.h"
|
||||
|
||||
using android::base::get_unaligned;
|
||||
|
||||
// This is for windows. If we don't open a file in binary mode, weird
|
||||
// things will happen.
|
||||
|
@ -46,11 +48,6 @@
|
|||
#define O_BINARY 0
|
||||
#endif
|
||||
|
||||
#define DISALLOW_IMPLICIT_CONSTRUCTORS(TypeName) \
|
||||
TypeName(); \
|
||||
TypeName(const TypeName&); \
|
||||
void operator=(const TypeName&)
|
||||
|
||||
// The "end of central directory" (EOCD) record. Each archive
|
||||
// contains exactly once such record which appears at the end of
|
||||
// the archive. It contains archive wide information like the
|
||||
|
@ -462,10 +459,12 @@ static int32_t MapCentralDirectory0(int fd, const char* debug_file_name,
|
|||
*/
|
||||
int i = read_amount - sizeof(EocdRecord);
|
||||
for (; i >= 0; i--) {
|
||||
if (scan_buffer[i] == 0x50 &&
|
||||
((*reinterpret_cast<uint32_t*>(&scan_buffer[i])) == EocdRecord::kSignature)) {
|
||||
ALOGV("+++ Found EOCD at buf+%d", i);
|
||||
break;
|
||||
if (scan_buffer[i] == 0x50) {
|
||||
uint32_t* sig_addr = reinterpret_cast<uint32_t*>(&scan_buffer[i]);
|
||||
if (get_unaligned<uint32_t>(sig_addr) == EocdRecord::kSignature) {
|
||||
ALOGV("+++ Found EOCD at buf+%d", i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (i < 0) {
|
||||
|
|
Loading…
Reference in a new issue