amcheck: Fix incorrect use of VARATT_IS_COMPRESSED.

The macro is being applied to a TOAST pointer, not a varlena header.
Therefore the use of VARATT_IS_COMPRESSED() is wrong. We can check
VARATT_EXTERNAL_IS_COMPRESSED(), but then we don't need the length
check that follows.

Report and fix by Kyotaro Horiguchi.

Discussion: http://postgr.es/m/20220517.162719.1671558681467343711.horikyota.ntt@gmail.com
This commit is contained in:
Robert Haas 2022-06-22 13:11:49 -04:00
parent 9f0b953457
commit e243de03fb
1 changed files with 1 additions and 9 deletions

View File

@ -1385,19 +1385,11 @@ check_tuple_attribute(HeapCheckContext *ctx)
toast_pointer.va_rawsize,
VARLENA_SIZE_LIMIT));
if (VARATT_IS_COMPRESSED(&toast_pointer))
if (VARATT_EXTERNAL_IS_COMPRESSED(toast_pointer))
{
ToastCompressionId cmid;
bool valid = false;
/* Compression should never expand the attribute */
if (VARATT_EXTERNAL_GET_EXTSIZE(toast_pointer) > toast_pointer.va_rawsize - VARHDRSZ)
report_corruption(ctx,
psprintf("toast value %u external size %u exceeds maximum expected for rawsize %d",
toast_pointer.va_valueid,
VARATT_EXTERNAL_GET_EXTSIZE(toast_pointer),
toast_pointer.va_rawsize));
/* Compressed attributes should have a valid compression method */
cmid = TOAST_COMPRESS_METHOD(&toast_pointer);
switch (cmid)