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::create_user_accessible(Process* owner, const Range& range, NonnullRefPtr vmobject, size_t offset_in_vmobject, OwnPtr 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::create_kernel_only(const Range& range, NonnullRefPtr vmobject, size_t offset_in_vmobject, OwnPtr name, Region::Access access, Cacheable cacheable) +OwnPtr Region::create_kernel_only(const Range& range, NonnullRefPtr vmobject, size_t offset_in_vmobject, OwnPtr 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 create_user_accessible(Process*, const Range&, NonnullRefPtr, size_t offset_in_vmobject, OwnPtr name, Region::Access access, Cacheable, bool shared); - static NonnullOwnPtr create_kernel_only(const Range&, NonnullRefPtr, size_t offset_in_vmobject, OwnPtr name, Region::Access access, Cacheable = Cacheable::Yes); + static OwnPtr create_kernel_only(const Range&, NonnullRefPtr, size_t offset_in_vmobject, OwnPtr name, Region::Access access, Cacheable = Cacheable::Yes); ~Region();