summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Gianforcaro <bgianf@serenityos.org>2021-05-28 05:07:33 -0700
committerAndreas Kling <kling@serenityos.org>2021-05-29 09:04:05 +0200
commit9b1ff3d3ac16237716fede8149f8b850c0d4d91f (patch)
tree595e7c367806d59159d1312150899be234e1329f
parentab63449ab77178cd2eb68033279e126160cce66c (diff)
downloadserenity-9b1ff3d3ac16237716fede8149f8b850c0d4d91f.zip
Kernel: Make Region creation API OOM safe
- Make Region::create_kernel_only OOM safe. - Make Region::create_user_accessible mostly OOM safe, there are still some tendrils to untangle before it and be completely fixed.
-rw-r--r--Kernel/VM/Region.cpp11
-rw-r--r--Kernel/VM/Region.h2
2 files changed, 7 insertions, 6 deletions
diff --git a/Kernel/VM/Region.cpp b/Kernel/VM/Region.cpp
index 9a4b375ecd..d7ace9d177 100644
--- a/Kernel/VM/Region.cpp
+++ b/Kernel/VM/Region.cpp
@@ -210,15 +210,16 @@ size_t Region::amount_shared() const
NonnullOwnPtr<Region> Region::create_user_accessible(Process* owner, const Range& range, NonnullRefPtr<VMObject> vmobject, size_t offset_in_vmobject, OwnPtr<KString> name, Region::Access access, Cacheable cacheable, bool shared)
{
- auto region = adopt_own(*new Region(range, move(vmobject), offset_in_vmobject, move(name), access, cacheable, shared));
- if (owner)
+ auto region = adopt_own_if_nonnull(new Region(range, move(vmobject), offset_in_vmobject, move(name), access, cacheable, shared));
+ if (region && owner)
region->m_owner = owner->make_weak_ptr();
- return region;
+ // FIXME: Return OwnPtr and propagate failure, currently there are too many assumptions made by down stream callers.
+ return region.release_nonnull();
}
-NonnullOwnPtr<Region> Region::create_kernel_only(const Range& range, NonnullRefPtr<VMObject> vmobject, size_t offset_in_vmobject, OwnPtr<KString> name, Region::Access access, Cacheable cacheable)
+OwnPtr<Region> Region::create_kernel_only(const Range& range, NonnullRefPtr<VMObject> vmobject, size_t offset_in_vmobject, OwnPtr<KString> name, Region::Access access, Cacheable cacheable)
{
- return adopt_own(*new Region(range, move(vmobject), offset_in_vmobject, move(name), access, cacheable, false));
+ return adopt_own_if_nonnull(new Region(range, move(vmobject), offset_in_vmobject, move(name), access, cacheable, false));
}
bool Region::should_cow(size_t page_index) const
diff --git a/Kernel/VM/Region.h b/Kernel/VM/Region.h
index f741bb9ee3..094a88de4b 100644
--- a/Kernel/VM/Region.h
+++ b/Kernel/VM/Region.h
@@ -51,7 +51,7 @@ public:
};
static NonnullOwnPtr<Region> create_user_accessible(Process*, const Range&, NonnullRefPtr<VMObject>, size_t offset_in_vmobject, OwnPtr<KString> name, Region::Access access, Cacheable, bool shared);
- static NonnullOwnPtr<Region> create_kernel_only(const Range&, NonnullRefPtr<VMObject>, size_t offset_in_vmobject, OwnPtr<KString> name, Region::Access access, Cacheable = Cacheable::Yes);
+ static OwnPtr<Region> create_kernel_only(const Range&, NonnullRefPtr<VMObject>, size_t offset_in_vmobject, OwnPtr<KString> name, Region::Access access, Cacheable = Cacheable::Yes);
~Region();