aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/datum.c
diff options
context:
space:
mode:
authorPeter Eisentraut <peter@eisentraut.org>2019-11-04 08:30:00 +0100
committerPeter Eisentraut <peter@eisentraut.org>2019-11-04 09:14:44 +0100
commit5a2967412f63f3b9390aa7b3af95e2fae0965ff8 (patch)
treedef4c7118217d04bcd18994da9ae721bc1cd5be8 /src/backend/utils/adt/datum.c
parent6dd92138d1efd0da89e90b98bd71b76c3905f9aa (diff)
downloadpostgresql-5a2967412f63f3b9390aa7b3af95e2fae0965ff8.tar.gz
postgresql-5a2967412f63f3b9390aa7b3af95e2fae0965ff8.zip
Catch invalid typlens in a couple of places
Rearrange the logic in record_image_cmp() and datum_image_eq() to error out on unexpected typlens (either not supported there or completely invalid due to corruption). Barring corruption, this is not possible today but it seems more future-proof and robust to fix this. Reported-by: Peter Geoghegan <pg@bowt.ie>
Diffstat (limited to 'src/backend/utils/adt/datum.c')
-rw-r--r--src/backend/utils/adt/datum.c22
1 files changed, 12 insertions, 10 deletions
diff --git a/src/backend/utils/adt/datum.c b/src/backend/utils/adt/datum.c
index 81ea5a48e59..76bd7ee1aa0 100644
--- a/src/backend/utils/adt/datum.c
+++ b/src/backend/utils/adt/datum.c
@@ -265,7 +265,17 @@ datum_image_eq(Datum value1, Datum value2, bool typByVal, int typLen)
{
bool result = true;
- if (typLen == -1)
+ if (typByVal)
+ {
+ result = (value1 == value2);
+ }
+ else if (typLen > 0)
+ {
+ result = (memcmp(DatumGetPointer(value1),
+ DatumGetPointer(value2),
+ typLen) == 0);
+ }
+ else if (typLen == -1)
{
Size len1,
len2;
@@ -294,16 +304,8 @@ datum_image_eq(Datum value1, Datum value2, bool typByVal, int typLen)
pfree(arg2val);
}
}
- else if (typByVal)
- {
- result = (value1 == value2);
- }
else
- {
- result = (memcmp(DatumGetPointer(value1),
- DatumGetPointer(value2),
- typLen) == 0);
- }
+ elog(ERROR, "unexpected typLen: %d", typLen);
return result;
}