diff --git a/recovery/recovery_updater.cpp b/recovery/recovery_updater.cpp index 97c61a5..c9f8702 100644 --- a/recovery/recovery_updater.cpp +++ b/recovery/recovery_updater.cpp @@ -32,13 +32,11 @@ #define MAX(a, b) (((a) > (b)) ? (a) : (b)) #define ALPHABET_LEN 256 -#define KB 1024 #define TZ_PART_PATH "/dev/block/bootdevice/by-name/tz" #define TZ_VER_STR "QC_IMAGE_VERSION_STRING=" #define TZ_VER_STR_LEN 24 #define TZ_VER_BUF_LEN 255 -#define TZ_SZ 4096 * KB /* MMAP 4096K of TZ, TZ partition is 4096K */ /* Boyer-Moore string search implementation from Wikipedia */ @@ -121,6 +119,7 @@ static char * bm_search(const char *str, size_t str_len, const char *pat, static int get_tz_version(char *ver_str, size_t len) { int ret = 0; int fd; + int tz_size; char *tz_data = NULL; char *offset = NULL; @@ -130,21 +129,27 @@ static int get_tz_version(char *ver_str, size_t len) { goto err_ret; } - tz_data = (char *) mmap(NULL, TZ_SZ, PROT_READ, MAP_PRIVATE, fd, 0); + tz_size = lseek64(fd, 0, SEEK_END); + if (tz_size == -1) { + ret = errno; + goto err_fd_close; + } + + tz_data = (char *) mmap(NULL, tz_size, PROT_READ, MAP_PRIVATE, fd, 0); if (tz_data == (char *)-1) { ret = errno; goto err_fd_close; } /* Do Boyer-Moore search across TZ data */ - offset = bm_search(tz_data, TZ_SZ, TZ_VER_STR, TZ_VER_STR_LEN); + offset = bm_search(tz_data, tz_size, TZ_VER_STR, TZ_VER_STR_LEN); if (offset != NULL) { strncpy(ver_str, offset + TZ_VER_STR_LEN, len); } else { ret = -ENOENT; } - munmap(tz_data, TZ_SZ); + munmap(tz_data, tz_size); err_fd_close: close(fd); err_ret: