]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
crypto: scomp - Fix off-by-one bug when calculating last page
authorHerbert Xu <herbert@gondor.apana.org.au>
Mon, 21 Apr 2025 03:31:31 +0000 (11:31 +0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Wed, 23 Apr 2025 01:32:57 +0000 (09:32 +0800)
Fix off-by-one bug in the last page calculation for src and dst.

Reported-by: Nhat Pham <nphamcs@gmail.com>
Fixes: 2d3553ecb4e3 ("crypto: scomp - Remove support for some non-trivial SG lists")
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
crypto/scompress.c

index 5762fcc63b5158aa043c5bead4699584fabeb43c..36934c78d1277ddf77c1f4d02b9874a5e1d1f763 100644 (file)
@@ -215,8 +215,8 @@ static int scomp_acomp_comp_decomp(struct acomp_req *req, int dir)
                        spage = nth_page(spage, soff / PAGE_SIZE);
                        soff = offset_in_page(soff);
 
-                       n = slen / PAGE_SIZE;
-                       n += (offset_in_page(slen) + soff - 1) / PAGE_SIZE;
+                       n = (slen - 1) / PAGE_SIZE;
+                       n += (offset_in_page(slen - 1) + soff) / PAGE_SIZE;
                        if (PageHighMem(nth_page(spage, n)) &&
                            size_add(soff, slen) > PAGE_SIZE)
                                break;
@@ -243,9 +243,9 @@ static int scomp_acomp_comp_decomp(struct acomp_req *req, int dir)
                        dpage = nth_page(dpage, doff / PAGE_SIZE);
                        doff = offset_in_page(doff);
 
-                       n = dlen / PAGE_SIZE;
-                       n += (offset_in_page(dlen) + doff - 1) / PAGE_SIZE;
-                       if (PageHighMem(dpage + n) &&
+                       n = (dlen - 1) / PAGE_SIZE;
+                       n += (offset_in_page(dlen - 1) + doff) / PAGE_SIZE;
+                       if (PageHighMem(nth_page(dpage, n)) &&
                            size_add(doff, dlen) > PAGE_SIZE)
                                break;
                        dst = kmap_local_page(dpage) + doff;