1
0
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:
Alexander Korotkov
2023-04-23 13:58:25 +03:00
parent 02191136cb
commit 48c6825d0e
4 changed files with 27 additions and 4 deletions

View File

@ -716,6 +716,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)
{
@ -724,8 +736,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();
}