1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-24 22:17:42 +00:00

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
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) if (m_userspace_mmap_region)
return ENOMEM; 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()) if (vmobject.is_null())
return ENOMEM; return ENOMEM;
@ -267,7 +267,7 @@ void VirtIOFrameBufferDevice::deactivate_writes()
m_are_writes_active = false; m_are_writes_active = false;
if (m_userspace_mmap_region) { if (m_userspace_mmap_region) {
auto* region = m_userspace_mmap_region.unsafe_ptr(); 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); VERIFY(vm_object);
region->set_vmobject(vm_object.release_nonnull()); region->set_vmobject(vm_object.release_nonnull());
region->remap(); region->remap();

View file

@ -13,7 +13,7 @@
namespace Kernel { namespace Kernel {
RefPtr<VMObject> AnonymousVMObject::clone() RefPtr<VMObject> AnonymousVMObject::try_clone()
{ {
// We need to acquire our lock so we copy a sane state // We need to acquire our lock so we copy a sane state
ScopedSpinLock lock(m_lock); 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_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_page(PhysicalPage& page);
static RefPtr<AnonymousVMObject> try_create_with_physical_pages(NonnullRefPtrVector<PhysicalPage>); 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); RefPtr<PhysicalPage> allocate_committed_page(size_t);
PageFaultResponse handle_cow_fault(size_t, VirtualAddress); 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(); VERIFY_NOT_REACHED();
} }

View file

@ -22,7 +22,7 @@ private:
explicit ContiguousVMObject(const ContiguousVMObject&); explicit ContiguousVMObject(const ContiguousVMObject&);
virtual StringView class_name() const override { return "ContiguousVMObject"sv; } 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=(const ContiguousVMObject&) = delete;
ContiguousVMObject& operator=(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())); 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)); return adopt_ref_if_nonnull(new (nothrow) PrivateInodeVMObject(*this));
} }

View file

@ -19,7 +19,7 @@ public:
virtual ~PrivateInodeVMObject() override; virtual ~PrivateInodeVMObject() override;
static RefPtr<PrivateInodeVMObject> try_create_with_inode(Inode&); static RefPtr<PrivateInodeVMObject> try_create_with_inode(Inode&);
virtual RefPtr<VMObject> clone() override; virtual RefPtr<VMObject> try_clone() override;
private: private:
virtual bool is_private_inode() const override { return true; } 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()) if (vmobject().is_inode())
VERIFY(vmobject().is_private_inode()); VERIFY(vmobject().is_private_inode());
auto vmobject_clone = vmobject().clone(); auto vmobject_clone = vmobject().try_clone();
if (!vmobject_clone) if (!vmobject_clone)
return {}; return {};

View file

@ -21,9 +21,9 @@ RefPtr<SharedInodeVMObject> SharedInodeVMObject::try_create_with_inode(Inode& in
return vmobject; 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) SharedInodeVMObject::SharedInodeVMObject(Inode& inode, size_t size)

View file

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

View file

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