mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-26 02:39:48 +00:00
dm btree: add a defensive bounds check to insert_at()
[ Upstream commit 85bca3c05b
]
Corrupt metadata could trigger an out of bounds write.
Signed-off-by: Joe Thornber <ejt@redhat.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
eafd73401a
commit
74b16f895b
1 changed files with 5 additions and 3 deletions
|
@ -87,10 +87,12 @@ static int insert_at(size_t value_size, struct btree_node *node, unsigned index,
|
||||||
__dm_written_to_disk(value)
|
__dm_written_to_disk(value)
|
||||||
{
|
{
|
||||||
uint32_t nr_entries = le32_to_cpu(node->header.nr_entries);
|
uint32_t nr_entries = le32_to_cpu(node->header.nr_entries);
|
||||||
|
uint32_t max_entries = le32_to_cpu(node->header.max_entries);
|
||||||
__le64 key_le = cpu_to_le64(key);
|
__le64 key_le = cpu_to_le64(key);
|
||||||
|
|
||||||
if (index > nr_entries ||
|
if (index > nr_entries ||
|
||||||
index >= le32_to_cpu(node->header.max_entries)) {
|
index >= max_entries ||
|
||||||
|
nr_entries >= max_entries) {
|
||||||
DMERR("too many entries in btree node for insert");
|
DMERR("too many entries in btree node for insert");
|
||||||
__dm_unbless_for_disk(value);
|
__dm_unbless_for_disk(value);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
Loading…
Reference in a new issue