]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-client.git/commitdiff
ceph: fix overflowed constant issue in ceph_do_objects_copy()
authorViacheslav Dubeyko <Slava.Dubeyko@ibm.com>
Fri, 6 Jun 2025 19:05:45 +0000 (12:05 -0700)
committerIlya Dryomov <idryomov@gmail.com>
Wed, 11 Jun 2025 07:45:05 +0000 (09:45 +0200)
The Coverity Scan service has detected overflowed constant
issue in ceph_do_objects_copy() [1]. The CID 1624308
defect contains explanation: "The overflowed value due to
arithmetic on constants is too small or unexpectedly
negative, causing incorrect computations. Expression bytes,
which is equal to -95, where ret is known to be equal to -95,
underflows the type that receives it, an unsigned integer
64 bits wide. In ceph_do_objects_copy: Integer overflow occurs
in arithmetic on constant operands (CWE-190)".

The patch changes the type of bytes variable from size_t
to ssize_t with the goal of to be capable to receive
negative values.

[1] https://scan5.scan.coverity.com/#/project-view/64304/10063?selectedIssue=1624308

Signed-off-by: Viacheslav Dubeyko <Slava.Dubeyko@ibm.com>
fs/ceph/file.c

index 192e3bdea333134f1e2240bf42d9633b001a55ec..246786e2c44755255b985f0bc0419fb8937ab1a0 100644 (file)
@@ -2953,7 +2953,7 @@ static ssize_t ceph_do_objects_copy(struct ceph_inode_info *src_ci, u64 *src_off
        struct ceph_object_id src_oid, dst_oid;
        struct ceph_osd_client *osdc;
        struct ceph_osd_request *req;
-       size_t bytes = 0;
+       ssize_t bytes = 0;
        u64 src_objnum, src_objoff, dst_objnum, dst_objoff;
        u32 src_objlen, dst_objlen;
        u32 object_size = src_ci->i_layout.object_size;
@@ -3003,7 +3003,7 @@ static ssize_t ceph_do_objects_copy(struct ceph_inode_info *src_ci, u64 *src_off
                                        "OSDs don't support copy-from2; disabling copy offload\n");
                        }
                        doutc(cl, "returned %d\n", ret);
-                       if (!bytes)
+                       if (bytes <= 0)
                                bytes = ret;
                        goto out;
                }