Move the record_page_number validation check into the
chapter index lookup function in order to detect (and
discard) corrupted values on all paths.

Signed-off-by: Matthew Sakai <[email protected]>
---
 drivers/md/dm-vdo/indexer/chapter-index.c | 15 +++++++++++----
 drivers/md/dm-vdo/indexer/volume.c        |  6 ------
 2 files changed, 11 insertions(+), 10 deletions(-)

diff --git a/drivers/md/dm-vdo/indexer/chapter-index.c 
b/drivers/md/dm-vdo/indexer/chapter-index.c
index bb3b0ab5d50d..9fb9e59238d4 100644
--- a/drivers/md/dm-vdo/indexer/chapter-index.c
+++ b/drivers/md/dm-vdo/indexer/chapter-index.c
@@ -284,10 +284,17 @@ int uds_search_chapter_index_page(struct delta_index_page 
*index_page,
        if (result != UDS_SUCCESS)
                return result;
 
-       if (was_entry_found(&entry, address))
-               *record_page_ptr = uds_get_delta_entry_value(&entry);
-       else
+       if (!was_entry_found(&entry, address)) {
                *record_page_ptr = NO_CHAPTER_INDEX_ENTRY;
+               return UDS_SUCCESS;
+       }
 
-       return UDS_SUCCESS;
+       *record_page_ptr = uds_get_delta_entry_value(&entry);
+       result = VDO_ASSERT(*record_page_ptr < 
geometry->record_pages_per_chapter,
+                           "0 <= %d < %u", *record_page_ptr,
+                           geometry->record_pages_per_chapter);
+       if (result != VDO_SUCCESS)
+               *record_page_ptr = NO_CHAPTER_INDEX_ENTRY;
+
+       return result;
 }
diff --git a/drivers/md/dm-vdo/indexer/volume.c 
b/drivers/md/dm-vdo/indexer/volume.c
index 78c3729f1f65..38e51fa1cbd0 100644
--- a/drivers/md/dm-vdo/indexer/volume.c
+++ b/drivers/md/dm-vdo/indexer/volume.c
@@ -891,12 +891,6 @@ int uds_search_cached_record_page(struct volume *volume, 
struct uds_request *req
        if (record_page_number == NO_CHAPTER_INDEX_ENTRY)
                return UDS_SUCCESS;
 
-       result = VDO_ASSERT(record_page_number < 
geometry->record_pages_per_chapter,
-                           "0 <= %d < %u", record_page_number,
-                           geometry->record_pages_per_chapter);
-       if (result != VDO_SUCCESS)
-               return result;
-
        page_number = geometry->index_pages_per_chapter + record_page_number;
 
        physical_page = map_to_physical_page(&volume->geometry, chapter, 
page_number);
-- 
2.53.0


Reply via email to