diff options
author | Brian Gianforcaro <bgianf@serenityos.org> | 2021-05-28 05:07:33 -0700 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2021-05-29 09:04:05 +0200 |
commit | 9b1ff3d3ac16237716fede8149f8b850c0d4d91f (patch) | |
tree | 595e7c367806d59159d1312150899be234e1329f | |
parent | ab63449ab77178cd2eb68033279e126160cce66c (diff) | |
download | serenity-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.cpp | 11 | ||||
-rw-r--r-- | Kernel/VM/Region.h | 2 |
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(); |