mirror of
https://github.com/MariaDB/server.git
synced 2025-01-20 05:52:27 +01:00
ndb - bug#26514
fix overflow that could occur when have either lots of dd-data or very high dd-parallelism storage/ndb/src/kernel/vm/RWPool.cpp: Add define for sizeof WOPage Make sure correct size is used when checking for end of page storage/ndb/src/kernel/vm/RWPool.hpp: Add define for sizeof RWPage storage/ndb/src/kernel/vm/WOPool.cpp: Add define for sizeof WOPage Make sure correct size is used when checking for end of page storage/ndb/src/kernel/vm/WOPool.hpp: Add define for sizeof WOPage Make sure correct size is used when checking for end of page
This commit is contained in:
parent
1266d24477
commit
95a477b5ec
4 changed files with 17 additions and 9 deletions
|
@ -22,7 +22,7 @@
|
|||
RWPool::RWPool()
|
||||
{
|
||||
bzero(this, sizeof(* this));
|
||||
m_current_pos = GLOBAL_PAGE_SIZE_WORDS;
|
||||
m_current_pos = RWPage::RWPAGE_WORDS;
|
||||
m_current_first_free = REC_NIL;
|
||||
m_first_free_page = RNIL;
|
||||
}
|
||||
|
@ -57,7 +57,7 @@ seize_free:
|
|||
m_current_first_free = pageP->m_data[pos+m_record_info.m_offset_next_pool];
|
||||
return true;
|
||||
}
|
||||
else if (pos + size < GLOBAL_PAGE_SIZE_WORDS)
|
||||
else if (pos + size < RWPage::RWPAGE_WORDS)
|
||||
{
|
||||
seize_first:
|
||||
ptr.i = (m_current_page_no << POOL_RECORD_BITS) + pos;
|
||||
|
@ -81,11 +81,14 @@ seize_first:
|
|||
{
|
||||
pageP = m_current_page = m_memroot + m_first_free_page;
|
||||
m_current_page_no = m_first_free_page;
|
||||
m_current_pos = GLOBAL_PAGE_SIZE_WORDS;
|
||||
m_current_pos = RWPage::RWPAGE_WORDS;
|
||||
m_current_first_free = m_current_page->m_first_free;
|
||||
m_first_free_page = m_current_page->m_next_page;
|
||||
m_current_ref_count = m_current_page->m_ref_count;
|
||||
(m_memroot + m_first_free_page)->m_prev_page = RNIL;
|
||||
if (m_first_free_page != RNIL)
|
||||
{
|
||||
(m_memroot + m_first_free_page)->m_prev_page = RNIL;
|
||||
}
|
||||
goto seize_free;
|
||||
}
|
||||
|
||||
|
@ -105,7 +108,7 @@ seize_first:
|
|||
|
||||
m_current_page = 0;
|
||||
m_current_page_no = RNIL;
|
||||
m_current_pos = GLOBAL_PAGE_SIZE_WORDS;
|
||||
m_current_pos = RWPage::RWPAGE_WORDS;
|
||||
m_current_first_free = REC_NIL;
|
||||
|
||||
return false;
|
||||
|
@ -154,6 +157,7 @@ RWPool::release(Ptr<void> ptr)
|
|||
}
|
||||
page->m_next_page = ffp;
|
||||
page->m_prev_page = RNIL;
|
||||
m_first_free_page = ptr_page;
|
||||
return;
|
||||
}
|
||||
else if(ref_cnt == 1)
|
||||
|
|
|
@ -20,12 +20,14 @@
|
|||
|
||||
struct RWPage
|
||||
{
|
||||
STATIC_CONST( RWPAGE_WORDS = GLOBAL_PAGE_SIZE_WORDS - 4 );
|
||||
|
||||
Uint32 m_type_id;
|
||||
Uint16 m_first_free;
|
||||
Uint16 m_ref_count;
|
||||
Uint32 m_next_page;
|
||||
Uint32 m_prev_page;
|
||||
Uint32 m_data[GLOBAL_PAGE_SIZE_WORDS - 4];
|
||||
Uint32 m_data[RWPAGE_WORDS];
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
WOPool::WOPool()
|
||||
{
|
||||
bzero(this, sizeof(* this));
|
||||
m_current_pos = GLOBAL_PAGE_SIZE_WORDS;
|
||||
m_current_pos = WOPage::WOPAGE_WORDS;
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -20,9 +20,11 @@
|
|||
|
||||
struct WOPage
|
||||
{
|
||||
STATIC_CONST( WOPAGE_WORDS = GLOBAL_PAGE_SIZE_WORDS - 2 );
|
||||
|
||||
Uint32 m_type_id;
|
||||
Uint32 m_ref_count;
|
||||
Uint32 m_data[GLOBAL_PAGE_SIZE_WORDS - 2];
|
||||
Uint32 m_data[WOPAGE_WORDS];
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -61,7 +63,7 @@ WOPool::seize(Ptr<void>& ptr)
|
|||
Uint32 pos = m_current_pos;
|
||||
Uint32 size = m_record_info.m_size;
|
||||
WOPage *pageP = m_current_page;
|
||||
if (likely(pos + size < GLOBAL_PAGE_SIZE_WORDS))
|
||||
if (likely(pos + size < WOPage::WOPAGE_WORDS))
|
||||
{
|
||||
ptr.i = (m_current_page_no << POOL_RECORD_BITS) + pos;
|
||||
ptr.p = (pageP->m_data + pos);
|
||||
|
|
Loading…
Reference in a new issue