Whamcloud - gitweb
LU-18608 pcc: fix INTEGER_OVERFLOW in pcc_file_read_iter() 11/57611/8
authorQian Yingjin <qian@ddn.com>
Sat, 28 Dec 2024 16:10:16 +0000 (00:10 +0800)
committerOleg Drokin <green@whamcloud.com>
Tue, 27 May 2025 04:04:35 +0000 (04:04 +0000)
Fixing the possible INTEGER_OVERFLOW issue reported from Coverity.

  /lustre/llite/pcc.c: 2643 in pcc_file_read_iter()
  2641         iocb->ki_filp = file;
  2642         pcc_io_fini(inode, PIT_READ, result, cached);
   CID 454276:  Insecure data handling  (INTEGER_OVERFLOW)
     "result", which might have overflowed,
     is returned from the function.
  2643         RETURN(result);

Test-Parameters: trivial testlist=sanity-pcc
CoverityID: 454276 ("Insecure data handing")
Fixes: ce98bfe5f72 ("LU-10499 pcc: add readonly mode for PCC")
Signed-off-by: Qian Yingjin <qian@ddn.com>
Change-Id: Ib856b7598441c06e0fcfe2e7f1eb4eef4d3d82b7
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/57611
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Arshad Hussain <arshad.hussain@aeoncomputing.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
lustre/llite/pcc.c

index 1cff8d2..3fcd855 100644 (file)
@@ -2520,7 +2520,7 @@ ssize_t pcc_file_read_iter(struct kiocb *iocb,
 
        /* Fake I/O error on PCC-RO */
        if (CFS_FAIL_CHECK(OBD_FAIL_LLITE_PCC_FAKE_ERROR))
-               GOTO(out, result = -EIO);
+               GOTO(out, rc = -EIO);
 
        iocb->ki_filp = pccf->pccf_file;
        if (!IS_ENCRYPTED(inode)) {
@@ -2529,7 +2529,7 @@ ssize_t pcc_file_read_iter(struct kiocb *iocb,
                 * to add support for ext4-dax.
                 */
                result = __pcc_file_read_iter(iocb, iter);
-               GOTO(out, result);
+               GOTO(out_filp, result);
        }
 
        /* from this point, we are dealing with an encrypted inode */
@@ -2619,10 +2619,13 @@ out_pageprivate2:
        if (iocb->ki_pos > i_size_read(inode) && result > 0)
                result -= iocb->ki_pos - i_size_read(inode);
 
-out:
+out_filp:
        iocb->ki_filp = file;
-       pcc_io_fini(inode, PIT_READ, result, cached);
-       RETURN(result);
+       if (result < 0)
+               rc = result;
+out:
+       pcc_io_fini(inode, PIT_READ, rc, cached);
+       RETURN(result > 0 ? result : rc);
 }
 
 static ssize_t