pgsql: Fix MCV input array checks in statistics restore functions

From: Noah Misch <noah(at)leadboat(dot)com>
To: pgsql-committers(at)lists(dot)postgresql(dot)org
Subject: pgsql: Fix MCV input array checks in statistics restore functions
Date: 2026-05-11 12:19:37
Message-ID: E1wMPbk-0002T9-2c@gemulon.postgresql.org
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-committers

Fix MCV input array checks in statistics restore functions

The SQL functions for the restore of attribute and expression statistics
accept "most_common_vals" and "most_common_freqs" as independent arrays.
The planner assumes these have the same number of elements, but it was
possible to insert in the catalogs data that would cause an over-read
when the catalog data is loaded in the planner.

There were two holes in the stats restore logic:
- Both arrays should match in size.
- The input array must be one-dimensional, and it should match with what
is delivered by pg_dump when scanning the pg_stats catalogs.

The multivariate extended statistics MCV path (import_mcv) already
validated these inputs via check_mcvlist_array(), and is not affected.
These problems exist in v18 and newer versions for the restore of
attribute statistics. These problems affect only HEAD for the restore
of the expression statistics.

Reported-by: Jeroen Gui <jeroen(dot)gui1(at)proton(dot)me>
Author: Michael Paquier <michael(at)paquier(dot)xyz>
Reviewed-by: Amit Langote <amitlangote09(at)gmail(dot)com>
Reviewed-by: John Naylor <johncnaylorls(at)gmail(dot)com>
Security: CVE-2026-6575
Backpatch-through: 18

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/6d6348f0329dd50ba9f954df28c2ffa88a15df07
Author: Michael Paquier <michael(at)paquier(dot)xyz>

Modified Files
--------------
src/backend/statistics/attribute_stats.c | 25 +++++-
src/backend/statistics/extended_stats_funcs.c | 26 ++++++
src/backend/statistics/stat_utils.c | 9 ++
src/test/regress/expected/stats_import.out | 117 +++++++++++++++++++++++++-
src/test/regress/sql/stats_import.sql | 76 +++++++++++++++++
5 files changed, 248 insertions(+), 5 deletions(-)

Browse pgsql-committers by date

  From Date Subject
Next Message Noah Misch 2026-05-11 12:19:38 pgsql: Harden our regex engine against integer overflow in size calcula
Previous Message Noah Misch 2026-05-11 12:19:36 pgsql: Apply timingsafe_bcmp() in authentication paths