mirror of
https://github.com/postgres/postgres.git
synced 2025-06-11 20:28:21 +03:00
Validate ltree siglen GiST option to be int-aligned
Unaligned siglen could lead to an unaligned access to subsequent key fields. Backpatch to 13, where opclass options were introduced. Reported-by: Alexander Lakhin Bug: 17847 Discussion: https://postgr.es/m/17847-171232970bea406b%40postgresql.org Reviewed-by: Tom Lane, Pavel Borisov, Alexander Lakhin Backpatch-through: 13
This commit is contained in:
@ -719,6 +719,18 @@ ltree_consistent(PG_FUNCTION_ARGS)
|
||||
PG_RETURN_BOOL(res);
|
||||
}
|
||||
|
||||
static void
|
||||
ltree_gist_relopts_validator(void *parsed_options, relopt_value *vals,
|
||||
int nvals)
|
||||
{
|
||||
LtreeGistOptions *options = (LtreeGistOptions *) parsed_options;
|
||||
|
||||
if (options->siglen != INTALIGN(options->siglen))
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
|
||||
errmsg("siglen value must be a multiple of %d", ALIGNOF_INT)));
|
||||
}
|
||||
|
||||
Datum
|
||||
ltree_gist_options(PG_FUNCTION_ARGS)
|
||||
{
|
||||
@ -727,8 +739,11 @@ ltree_gist_options(PG_FUNCTION_ARGS)
|
||||
init_local_reloptions(relopts, sizeof(LtreeGistOptions));
|
||||
add_local_int_reloption(relopts, "siglen",
|
||||
"signature length in bytes",
|
||||
LTREE_SIGLEN_DEFAULT, 1, LTREE_SIGLEN_MAX,
|
||||
LTREE_SIGLEN_DEFAULT,
|
||||
INTALIGN(1),
|
||||
LTREE_SIGLEN_MAX,
|
||||
offsetof(LtreeGistOptions, siglen));
|
||||
register_reloptions_validator(relopts, ltree_gist_relopts_validator);
|
||||
|
||||
PG_RETURN_VOID();
|
||||
}
|
||||
|
Reference in New Issue
Block a user