diff options
-rw-r--r-- | host/lib/fmap.c | 11 | ||||
-rw-r--r-- | host/lib/include/fmap.h | 1 |
2 files changed, 9 insertions, 3 deletions
diff --git a/host/lib/fmap.c b/host/lib/fmap.c index 3c3f340b..014c97b2 100644 --- a/host/lib/fmap.c +++ b/host/lib/fmap.c @@ -12,10 +12,15 @@ const char* FmapFind(const char* ptr, size_t size) { size_t i; - for (i=0; i<size; i += FMAP_SEARCH_STRIDE) { - if (0 == strncmp(ptr, FMAP_SIGNATURE, FMAP_SIGNATURE_SIZE)) + FmapHeader *fmap_header; + for (i=0; i<size; i += FMAP_SEARCH_STRIDE, ptr += FMAP_SEARCH_STRIDE) { + if (0 != strncmp(ptr, FMAP_SIGNATURE, FMAP_SIGNATURE_SIZE)) + continue; + // Image may have multiple signatures (ex, in code that handles FMAP itself) + // so we do want to check at least major version. + fmap_header = (FmapHeader *)ptr; + if (fmap_header->fmap_ver_major == FMAP_VER_MAJOR) return ptr; - ptr += FMAP_SEARCH_STRIDE; } return NULL; } diff --git a/host/lib/include/fmap.h b/host/lib/include/fmap.h index 7da2dd90..92d74fd3 100644 --- a/host/lib/include/fmap.h +++ b/host/lib/include/fmap.h @@ -15,6 +15,7 @@ #define FMAP_SIGNATURE "__FMAP__" #define FMAP_SIGNATURE_SIZE 8 #define FMAP_SEARCH_STRIDE 4 +#define FMAP_VER_MAJOR 1 typedef struct _FmapHeader { char fmap_signature[FMAP_SIGNATURE_SIZE]; /* avoiding endian issues */ uint8_t fmap_ver_major; |