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>
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
}
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);
}