]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: object lock uses 64-bit encoding for RetainUntilDate 54675/head
authorCasey Bodley <cbodley@redhat.com>
Wed, 15 Nov 2023 21:24:47 +0000 (16:24 -0500)
committerCasey Bodley <cbodley@redhat.com>
Thu, 11 Jan 2024 15:57:11 +0000 (10:57 -0500)
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 <cbodley@redhat.com>
(cherry picked from commit 1fd4309fbbebf0d3e67aa2800d5fb3c7de19dcc7)

PendingReleaseNotes
src/rgw/rgw_object_lock.h

index 2566caa81aa3e4d4c727ec873249989de630e464..1dce4f83b03be87fcaac02a4c3c7989acc16f7b1 100644 (file)
   affected and to clean them up accordingly.
 * mgr/snap-schedule: For clusters with multiple CephFS file systems, all the
   snap-schedule commands now expect the '--fs' argument.
+* 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
 
index 997c660e4cd11a3e0c29676a5fbe586a2fce0b27..44b4f7ca11be37586c9e4153da392ed2d9e78745 100644 (file)
@@ -171,16 +171,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);
   }