mirror of
https://github.com/postgres/postgres.git
synced 2025-05-29 16:21:20 +03:00
Fix overflow danger in SampleHeapTupleVisible()
68d9662be1c4b70 made HeapScanDesc->rs_ntuples unsigned but neglected to change how it was being used in SampleHeapTupleVisible(). Return early if rs_ntuples is 0 to avoid overflowing and incorrectly executing the loop code in SampleHeapTupleVisible(). Reported-by: Ranier Vilela Discussion: https://postgr.es/m/CAEudQAot_xQoZyPZjpj1aBUPrPykY5mOPHGyvfe%3Djz%2BWowdA3A%40mail.gmail.com
This commit is contained in:
parent
68d9662be1
commit
28328ec87b
@ -2577,6 +2577,12 @@ SampleHeapTupleVisible(TableScanDesc scan, Buffer buffer,
|
|||||||
|
|
||||||
if (scan->rs_flags & SO_ALLOW_PAGEMODE)
|
if (scan->rs_flags & SO_ALLOW_PAGEMODE)
|
||||||
{
|
{
|
||||||
|
uint32 start,
|
||||||
|
end;
|
||||||
|
|
||||||
|
if (hscan->rs_ntuples == 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* In pageatatime mode, heap_prepare_pagescan() already did visibility
|
* In pageatatime mode, heap_prepare_pagescan() already did visibility
|
||||||
* checks, so just look at the info it left in rs_vistuples[].
|
* checks, so just look at the info it left in rs_vistuples[].
|
||||||
@ -2586,12 +2592,12 @@ SampleHeapTupleVisible(TableScanDesc scan, Buffer buffer,
|
|||||||
* in increasing order, but it's not clear that there would be enough
|
* in increasing order, but it's not clear that there would be enough
|
||||||
* gain to justify the restriction.
|
* gain to justify the restriction.
|
||||||
*/
|
*/
|
||||||
int start = 0,
|
start = 0;
|
||||||
end = hscan->rs_ntuples - 1;
|
end = hscan->rs_ntuples - 1;
|
||||||
|
|
||||||
while (start <= end)
|
while (start <= end)
|
||||||
{
|
{
|
||||||
int mid = (start + end) / 2;
|
uint32 mid = (start + end) / 2;
|
||||||
OffsetNumber curoffset = hscan->rs_vistuples[mid];
|
OffsetNumber curoffset = hscan->rs_vistuples[mid];
|
||||||
|
|
||||||
if (tupoffset == curoffset)
|
if (tupoffset == curoffset)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user