Kernel: Rename VMObject::clone() => try_clone()

And fix an unsafe dereference in SharedInodeVMObject::try_clone()
to make it OOM-safe.
This commit is contained in:
Andreas Kling 2021-07-11 19:07:00 +02:00
parent d85bce57b3
commit f244a25f71
Notes: sideshowbarker 2024-07-18 09:19:04 +09:00
11 changed files with 13 additions and 13 deletions

View file

@ -245,7 +245,7 @@ KResultOr<Region*> VirtIOFrameBufferDevice::mmap(Process& process, FileDescripti
if (m_userspace_mmap_region)
return ENOMEM;
auto vmobject = m_are_writes_active ? m_framebuffer->vmobject().clone() : m_framebuffer_sink_vmobject;
auto vmobject = m_are_writes_active ? m_framebuffer->vmobject().try_clone() : m_framebuffer_sink_vmobject;
if (vmobject.is_null())
return ENOMEM;
@ -267,7 +267,7 @@ void VirtIOFrameBufferDevice::deactivate_writes()
m_are_writes_active = false;
if (m_userspace_mmap_region) {
auto* region = m_userspace_mmap_region.unsafe_ptr();
auto vm_object = m_framebuffer_sink_vmobject->clone();
auto vm_object = m_framebuffer_sink_vmobject->try_clone();
VERIFY(vm_object);
region->set_vmobject(vm_object.release_nonnull());
region->remap();

View file

@ -13,7 +13,7 @@
namespace Kernel {
RefPtr<VMObject> AnonymousVMObject::clone()
RefPtr<VMObject> AnonymousVMObject::try_clone()
{
// We need to acquire our lock so we copy a sane state
ScopedSpinLock lock(m_lock);

View file

@ -25,7 +25,7 @@ public:
static RefPtr<AnonymousVMObject> try_create_for_physical_range(PhysicalAddress paddr, size_t size);
static RefPtr<AnonymousVMObject> try_create_with_physical_page(PhysicalPage& page);
static RefPtr<AnonymousVMObject> try_create_with_physical_pages(NonnullRefPtrVector<PhysicalPage>);
virtual RefPtr<VMObject> clone() override;
virtual RefPtr<VMObject> try_clone() override;
RefPtr<PhysicalPage> allocate_committed_page(size_t);
PageFaultResponse handle_cow_fault(size_t, VirtualAddress);

View file

@ -36,7 +36,7 @@ ContiguousVMObject::~ContiguousVMObject()
{
}
RefPtr<VMObject> ContiguousVMObject::clone()
RefPtr<VMObject> ContiguousVMObject::try_clone()
{
VERIFY_NOT_REACHED();
}

View file

@ -22,7 +22,7 @@ private:
explicit ContiguousVMObject(const ContiguousVMObject&);
virtual StringView class_name() const override { return "ContiguousVMObject"sv; }
virtual RefPtr<VMObject> clone() override;
virtual RefPtr<VMObject> try_clone() override;
ContiguousVMObject& operator=(const ContiguousVMObject&) = delete;
ContiguousVMObject& operator=(ContiguousVMObject&&) = delete;

View file

@ -14,7 +14,7 @@ RefPtr<PrivateInodeVMObject> PrivateInodeVMObject::try_create_with_inode(Inode&
return adopt_ref_if_nonnull(new (nothrow) PrivateInodeVMObject(inode, inode.size()));
}
RefPtr<VMObject> PrivateInodeVMObject::clone()
RefPtr<VMObject> PrivateInodeVMObject::try_clone()
{
return adopt_ref_if_nonnull(new (nothrow) PrivateInodeVMObject(*this));
}

View file

@ -19,7 +19,7 @@ public:
virtual ~PrivateInodeVMObject() override;
static RefPtr<PrivateInodeVMObject> try_create_with_inode(Inode&);
virtual RefPtr<VMObject> clone() override;
virtual RefPtr<VMObject> try_clone() override;
private:
virtual bool is_private_inode() const override { return true; }

View file

@ -100,7 +100,7 @@ OwnPtr<Region> Region::clone(Process& new_owner)
if (vmobject().is_inode())
VERIFY(vmobject().is_private_inode());
auto vmobject_clone = vmobject().clone();
auto vmobject_clone = vmobject().try_clone();
if (!vmobject_clone)
return {};

View file

@ -21,9 +21,9 @@ RefPtr<SharedInodeVMObject> SharedInodeVMObject::try_create_with_inode(Inode& in
return vmobject;
}
RefPtr<VMObject> SharedInodeVMObject::clone()
RefPtr<VMObject> SharedInodeVMObject::try_clone()
{
return adopt_ref(*new SharedInodeVMObject(*this));
return adopt_ref_if_nonnull(new SharedInodeVMObject(*this));
}
SharedInodeVMObject::SharedInodeVMObject(Inode& inode, size_t size)

View file

@ -17,7 +17,7 @@ class SharedInodeVMObject final : public InodeVMObject {
public:
static RefPtr<SharedInodeVMObject> try_create_with_inode(Inode&);
virtual RefPtr<VMObject> clone() override;
virtual RefPtr<VMObject> try_clone() override;
private:
virtual bool is_shared_inode() const override { return true; }

View file

@ -32,7 +32,7 @@ class VMObject : public RefCounted<VMObject>
public:
virtual ~VMObject();
virtual RefPtr<VMObject> clone() = 0;
virtual RefPtr<VMObject> try_clone() = 0;
virtual bool is_anonymous() const { return false; }
virtual bool is_inode() const { return false; }