postgrespro.git / summary / log / commit / refs
commit 2dc08bd6179d8cf480c93701010c19ad7a9891d8
Author: Tomas Vondra <tomas.vondra@postgresql.org>
Date: Sat Nov 16 01:40:02 2019 +0000
Properly determine length for on-disk TOAST values
In detoast_attr_slice, VARSIZE_ANY was used to compute compressed length
of on-disk TOAST values. That's incorrect, because the varlena value may
be just a TOAST pointer, producing either bogus value or crashing.
This is likely why the code was crashing on big-endian machines before
540f31680913 replaced the VARSIZE with VARSIZE_ANY, which however only
masked the issue.
Reported-by: Rushabh Lathia
Discussion: https://postgr.es/m/CAL-OGkthU9Gs7TZchf5OWaL-Gsi=hXqufTxKv9qpNG73d5na_g@mail.gmail.com
src/backend/access/common/detoast.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/backend/access/common/detoast.c b/src/backend/access/common/detoast.c
index f752ac7bbc..8c89fc2a55 100644
--- a/src/backend/access/common/detoast.c
+++ b/src/backend/access/common/detoast.c
@@ -233,7 +233,7 @@ detoast_attr_slice(struct varlena *attr,
* of a given length (after decompression).
*/
max_size = pglz_maximum_compressed_size(sliceoffset + slicelength,
- TOAST_COMPRESS_SIZE(attr));
+ toast_pointer.va_extsize);
/*
* Fetch enough compressed slices (compressed marker will get set
[parent: d482f7f867b5]