Kernel: Don't crash if unable to map ramdisk inside kernel address space

This commit is contained in:
Jean-Baptiste Boric 2021-04-06 17:15:20 +02:00 committed by Andreas Kling
parent 436ca2491d
commit 346e0f4dac
Notes: sideshowbarker 2024-07-18 20:43:25 +09:00
3 changed files with 9 additions and 6 deletions

View file

@ -70,7 +70,10 @@ RamdiskController::RamdiskController()
if (used_memory_range.type == UsedMemoryRangeType::BootModule) { if (used_memory_range.type == UsedMemoryRangeType::BootModule) {
size_t length = page_round_up(used_memory_range.end.get()) - used_memory_range.start.get(); size_t length = page_round_up(used_memory_range.end.get()) - used_memory_range.start.get();
auto region = MemoryManager::the().allocate_kernel_region(used_memory_range.start, length, "Ramdisk", Region::Access::Read | Region::Access::Write); auto region = MemoryManager::the().allocate_kernel_region(used_memory_range.start, length, "Ramdisk", Region::Access::Read | Region::Access::Write);
m_devices.append(RamdiskDevice::create(*this, move(region), 6, count)); if (!region)
dmesgln("RamdiskController: Failed to allocate kernel region of size {}", length);
else
m_devices.append(RamdiskDevice::create(*this, region.release_nonnull(), 6, count));
count++; count++;
} }
} }

View file

@ -32,12 +32,12 @@
namespace Kernel { namespace Kernel {
NonnullRefPtr<RamdiskDevice> RamdiskDevice::create(const RamdiskController& controller, OwnPtr<Region>&& region, int major, int minor) NonnullRefPtr<RamdiskDevice> RamdiskDevice::create(const RamdiskController& controller, NonnullOwnPtr<Region>&& region, int major, int minor)
{ {
return adopt(*new RamdiskDevice(controller, move(region), major, minor)); return adopt(*new RamdiskDevice(controller, move(region), major, minor));
} }
RamdiskDevice::RamdiskDevice(const RamdiskController& controller, OwnPtr<Region>&& region, int major, int minor) RamdiskDevice::RamdiskDevice(const RamdiskController& controller, NonnullOwnPtr<Region>&& region, int major, int minor)
: StorageDevice(controller, major, minor, 512, region->size() / 512) : StorageDevice(controller, major, minor, 512, region->size() / 512)
, m_region(move(region)) , m_region(move(region))
{ {

View file

@ -37,8 +37,8 @@ class RamdiskDevice final : public StorageDevice {
friend class RamdiskController; friend class RamdiskController;
AK_MAKE_ETERNAL AK_MAKE_ETERNAL
public: public:
static NonnullRefPtr<RamdiskDevice> create(const RamdiskController&, OwnPtr<Region>&& region, int major, int minor); static NonnullRefPtr<RamdiskDevice> create(const RamdiskController&, NonnullOwnPtr<Region>&& region, int major, int minor);
RamdiskDevice(const RamdiskController&, OwnPtr<Region>&&, int major, int minor); RamdiskDevice(const RamdiskController&, NonnullOwnPtr<Region>&&, int major, int minor);
virtual ~RamdiskDevice() override; virtual ~RamdiskDevice() override;
// ^StorageDevice // ^StorageDevice
@ -55,7 +55,7 @@ public:
Lock m_lock { "RamdiskDevice" }; Lock m_lock { "RamdiskDevice" };
OwnPtr<Region> m_region; NonnullOwnPtr<Region> m_region;
}; };
} }