From: Casey Bodley Date: Wed, 15 Nov 2023 21:24:47 +0000 (-0500) Subject: rgw: object lock uses 64-bit encoding for RetainUntilDate X-Git-Tag: v19.0.0~46^2~1 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=1fd4309fbbebf0d3e67aa2800d5fb3c7de19dcc7;p=ceph-ci.git rgw: object lock uses 64-bit encoding for RetainUntilDate the default encoding of ceph::real_time truncates seconds to uint32_t, so stores the wrong timestamp for object lock enforcement Fixes: https://tracker.ceph.com/issues/63537 Signed-off-by: Casey Bodley --- diff --git a/PendingReleaseNotes b/PendingReleaseNotes index 9acda3d64e1..9b3dfede8bb 100644 --- a/PendingReleaseNotes +++ b/PendingReleaseNotes @@ -69,6 +69,14 @@ CephFS: Disallow delegating preallocated inode ranges to clients. Config in the kclient. * S3 Get/HeadObject now support query parameter `partNumber` to read a specific part of a completed multipart upload. +* RGW: Fixed a S3 Object Lock bug with PutObjectRetention requests that specify + a RetainUntilDate after the year 2106. This date was truncated to 32 bits when + stored, so a much earlier date was used for object lock enforcement. This does + not effect PutBucketObjectLockConfiguration where a duration is given in Days. + The RetainUntilDate encoding is fixed for new PutObjectRetention requests, but + cannot repair the dates of existing object locks. Such objects can be identified + with a HeadObject request based on the x-amz-object-lock-retain-until-date + response header. >=18.0.0 diff --git a/src/rgw/rgw_object_lock.h b/src/rgw/rgw_object_lock.h index 022aef8d45a..7c6b9cf612b 100644 --- a/src/rgw/rgw_object_lock.h +++ b/src/rgw/rgw_object_lock.h @@ -174,16 +174,20 @@ public: } void encode(bufferlist& bl) const { - ENCODE_START(1, 1, bl); + ENCODE_START(2, 1, bl); encode(mode, bl); encode(retain_until_date, bl); + ceph::round_trip_encode(retain_until_date, bl); ENCODE_FINISH(bl); } void decode(bufferlist::const_iterator& bl) { - DECODE_START(1, bl); + DECODE_START(2, bl); decode(mode, bl); decode(retain_until_date, bl); + if (struct_v >= 2) { + ceph::round_trip_decode(retain_until_date, bl); + } DECODE_FINISH(bl); }