[Devel] [PATCH RHEL8 COMMIT] cbt: Fix off-by-one in map_required_size()

Konstantin Khorenko khorenko at virtuozzo.com
Thu Sep 30 22:08:13 MSK 2021


The commit is pushed to "branch-rh8-4.18.0-305.3.1.vz8.7.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh8-4.18.0-305.3.1.vz8.7.15
------>
commit b1b5d89d9dcf95264873eb4408e8c9ae8406d254
Author: Kirill Tkhai <ktkhai at virtuozzo.com>
Date:   Thu Sep 30 22:08:13 2021 +0300

    cbt: Fix off-by-one in map_required_size()
    
    Instead of:
    
    return DIV_ROUND_UP(bit, 8) + page * PAGE_SIZE;
    
    we have to have:
    
    return DIV_ROUND_UP(bit, 8) + (page - 1) * PAGE_SIZE;
    
    But instead of that we fix @page to be enumerated
    from 0 in standard C way.
    
    Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
---
 block/blk-cbt.c | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/block/blk-cbt.c b/block/blk-cbt.c
index 1ccc393f1419..e8eee11a87ba 100644
--- a/block/blk-cbt.c
+++ b/block/blk-cbt.c
@@ -315,15 +315,14 @@ static unsigned long map_required_size(struct page **map, unsigned long block_ma
 {
 	unsigned long bit, page, npages = NR_PAGES(block_max);
 
-	for (page = npages; page > 0; page--) {
-		if (map[page-1])
+	for (page = npages - 1; page != ULONG_MAX; page--) {
+		if (map[page])
 			break;
 	}
-
-	if (page == 0)
+	if (page == ULONG_MAX)
 		return 0;
 
-	bit = find_last_bit(page_address(map[page - 1]), PAGE_SIZE);
+	bit = find_last_bit(page_address(map[page]), PAGE_SIZE);
 	if (bit >= PAGE_SIZE)
 		bit = 0; /* Not found */
 	else


More information about the Devel mailing list