Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 1622f08

Browse files
author
Alexander Korotkov
committed
Fix bug with freeing page which wasn't allocated
Also add more assertions to fsm.c.
1 parent 5e29378 commit 1622f08

File tree

2 files changed

+14
-5
lines changed

2 files changed

+14
-5
lines changed

contrib/in_memory/fdw_descr.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ imFetchDescrForOidWithShared(Oid oid, SharedDescr *shared_descr)
211211
}
212212
PG_CATCH();
213213
{
214-
for (i = 0; i <= MaxIndices; i++)
214+
for (i = 0; i < MaxIndices; i++)
215215
{
216216
if (PageNumberIsValid(shared_descr->tree[i].root))
217217
fsm_free_page(shared_descr->tree[i].root);

contrib/in_memory/fsm.c

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ init_fsm(Pointer ptr, bool found)
122122
}
123123

124124
/* Initialize non-leafs */
125-
for (i = 0; i < fsm_non_leaf; i++)
125+
for (i = 0; i < FSM_BRANCH_FACTOR; i++)
126126
init_fsm_non_leaf_recursive(i);
127127
}
128128

@@ -142,6 +142,7 @@ fsm_get_page(void)
142142

143143
for (j = i; j < i + FSM_BRANCH_FACTOR; j++)
144144
{
145+
Assert(j >= 0 && j < fsm_non_leaf);
145146
uint32 val = pg_atomic_read_u32(&fsm[j]);
146147
if (val != 0)
147148
{
@@ -170,10 +171,13 @@ fsm_get_page(void)
170171
{
171172
uint32 val = pg_atomic_read_u32(&fsm[j]);
172173

174+
Assert(j >= fsm_non_leaf && j < fsm_total);
175+
173176
if (val != 0xFFFFFFFF)
174177
{
175-
int bitno = 0;
176-
uint32 bit = (val + 1) & ~val;
178+
PageNumber result;
179+
int bitno = 0;
180+
uint32 bit = (val + 1) & ~val;
177181

178182
val = pg_atomic_fetch_or_u32(&fsm[j], bit);
179183
if ((val & bit) != 0)
@@ -182,7 +186,9 @@ fsm_get_page(void)
182186
bit >>= 1;
183187
while (bit > 0) { bitno++; bit >>= 1; }
184188
Assert(bitno < 32);
185-
return (j - fsm_non_leaf) * 32 + bitno;
189+
result = (j - fsm_non_leaf) * 32 + bitno;
190+
Assert(result <= shared_pool_size / IN_MEMORY_BLCKSZ);
191+
return result;
186192
}
187193
}
188194
}
@@ -211,12 +217,15 @@ fsm_free_page(PageNumber pageno)
211217
i = pageno / 32 + fsm_non_leaf;
212218
bitno = pageno % 32;
213219

220+
Assert(i >= fsm_non_leaf && i < fsm_total);
221+
214222
Assert((pg_atomic_read_u32(&fsm[i]) & (1 << bitno)) != 0);
215223
pg_atomic_fetch_and_u32(&fsm[i], ~(1 << bitno));
216224

217225
while (i >= FSM_BRANCH_FACTOR)
218226
{
219227
i = (i / FSM_BRANCH_FACTOR) - 1;
228+
Assert(i >= 0 && i < fsm_non_leaf);
220229
pg_atomic_fetch_add_u32(&fsm[i], 1);
221230
}
222231
}

0 commit comments

Comments
 (0)