Fix memory overrun when querying pg_stat_slru
pg_stat_get_slru() in pgstatfuncs.c would point to one element after the end of the array PgStat_SLRUStats when finishing to scan its entries. This had no direct consequences as no data from the extra memory area was read, but static analyzers would rightfully complain here. So let's be clean. While on it, this adds one regression test in the area reserved for system views. Reported-by: Alexander Kozhemyakin, via AddressSanitizer Author: Kyotaro Horiguchi Discussion: https://postgr.es/m/17280-37da556e86032070@postgresql.org Backpatch-through: 13
This commit is contained in:
parent
d4e9d69469
commit
a691a22983
@ -1744,7 +1744,7 @@ pg_stat_get_slru(PG_FUNCTION_ARGS)
|
|||||||
/* for each row */
|
/* for each row */
|
||||||
Datum values[PG_STAT_GET_SLRU_COLS];
|
Datum values[PG_STAT_GET_SLRU_COLS];
|
||||||
bool nulls[PG_STAT_GET_SLRU_COLS];
|
bool nulls[PG_STAT_GET_SLRU_COLS];
|
||||||
PgStat_SLRUStats stat = stats[i];
|
PgStat_SLRUStats stat;
|
||||||
const char *name;
|
const char *name;
|
||||||
|
|
||||||
name = pgstat_slru_name(i);
|
name = pgstat_slru_name(i);
|
||||||
@ -1752,6 +1752,7 @@ pg_stat_get_slru(PG_FUNCTION_ARGS)
|
|||||||
if (!name)
|
if (!name)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
stat = stats[i];
|
||||||
MemSet(values, 0, sizeof(values));
|
MemSet(values, 0, sizeof(values));
|
||||||
MemSet(nulls, 0, sizeof(nulls));
|
MemSet(nulls, 0, sizeof(nulls));
|
||||||
|
|
||||||
|
@ -67,6 +67,13 @@ select count(*) >= 0 as ok from pg_prepared_xacts;
|
|||||||
t
|
t
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
|
-- There will surely be at least one SLRU cache
|
||||||
|
select count(*) > 0 as ok from pg_stat_slru;
|
||||||
|
ok
|
||||||
|
----
|
||||||
|
t
|
||||||
|
(1 row)
|
||||||
|
|
||||||
-- We expect no walreceiver running in this test
|
-- We expect no walreceiver running in this test
|
||||||
select count(*) = 0 as ok from pg_stat_wal_receiver;
|
select count(*) = 0 as ok from pg_stat_wal_receiver;
|
||||||
ok
|
ok
|
||||||
|
@ -32,6 +32,9 @@ select count(*) = 0 as ok from pg_prepared_statements;
|
|||||||
-- See also prepared_xacts.sql
|
-- See also prepared_xacts.sql
|
||||||
select count(*) >= 0 as ok from pg_prepared_xacts;
|
select count(*) >= 0 as ok from pg_prepared_xacts;
|
||||||
|
|
||||||
|
-- There will surely be at least one SLRU cache
|
||||||
|
select count(*) > 0 as ok from pg_stat_slru;
|
||||||
|
|
||||||
-- We expect no walreceiver running in this test
|
-- We expect no walreceiver running in this test
|
||||||
select count(*) = 0 as ok from pg_stat_wal_receiver;
|
select count(*) = 0 as ok from pg_stat_wal_receiver;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user