Kaynağa Gözat

fix(vfs_open): check nullptr

greatbridf 2 yıl önce
ebeveyn
işleme
d8a3f66f7a
4 değiştirilmiş dosya ile 23 ekleme ve 3 silme
  1. 2 0
      src/kernel/hw/ata.cpp
  2. 6 2
      src/kernel/process.cpp
  3. 5 0
      src/kernel/vfs.cpp
  4. 10 1
      src/types/elf.cpp

+ 2 - 0
src/kernel/hw/ata.cpp

@@ -182,6 +182,7 @@ static inline void mbr_part_probe(fs::inode* drive, uint16_t major, uint16_t min
     struct mbr hda_mbr {
     };
     auto* dev = fs::vfs_open("/dev");
+    assert(dev);
 
     fs::vfs_read(drive, (char*)&hda_mbr, 512, 0, 512);
 
@@ -228,5 +229,6 @@ void hw::init_ata(void)
         0xffffffff);
 
     auto* hda = fs::vfs_open("/dev/hda");
+    assert(hda);
     mbr_part_probe(hda->ind, 2, 1);
 }

+ 6 - 2
src/kernel/process.cpp

@@ -191,8 +191,12 @@ void NORETURN _kernel_init(void)
     hw::init_ata();
 
     // TODO: parse kernel parameters
-    auto* _new_fs = fs::register_fs(types::_new<types::kernel_allocator, fs::fat::fat32>(fs::vfs_open("/dev/hda1")->ind));
-    int ret = fs::fs_root->ind->fs->mount(fs::vfs_open("/mnt"), _new_fs);
+    auto* drive = fs::vfs_open("/dev/hda1");
+    assert(drive);
+    auto* _new_fs = fs::register_fs(types::_new<types::kernel_allocator, fs::fat::fat32>(drive->ind));
+    auto* mnt = fs::vfs_open("/mnt");
+    assert(mnt);
+    int ret = fs::fs_root->ind->fs->mount(mnt, _new_fs);
     assert(ret == GB_OK);
 
     current_process->attr.system = 0;

+ 5 - 0
src/kernel/vfs.cpp

@@ -82,6 +82,9 @@ fs::vfs::dentry* fs::vfs::dentry::append(inode* ind, name_type&& name, bool set_
 }
 fs::vfs::dentry* fs::vfs::dentry::find(const name_type& name)
 {
+    if (!ind->flags.in.directory)
+        return nullptr;
+
     if (ind->flags.in.directory && !flags.in.present)
         ind->fs->load_dentry(this);
 
@@ -530,6 +533,8 @@ fs::vfs::dentry* fs::vfs_open(const char* path)
 int fs::vfs_stat(const char* filename, stat* stat)
 {
     auto ent = vfs_open(filename);
+    if (!ent)
+        return GB_FAILED;
     return vfs_stat(ent, stat);
 }
 int fs::vfs_stat(fs::vfs::dentry* ent, stat* stat)

+ 10 - 1
src/types/elf.cpp

@@ -92,7 +92,16 @@ int types::elf::elf32_load(types::elf::elf32_load_data* d)
     // so we can't just simply return to it on error.
     current_process->mms.clear_user();
 
-    auto* null_ind = fs::vfs_open("/dev/null")->ind;
+    fs::inode* null_ind = nullptr;
+    {
+        auto* dent = fs::vfs_open("/dev/null");
+        if (!dent) {
+            k_free(shents);
+            k_free(phents);
+            kill_current(-1);
+        }
+        null_ind = dent->ind;
+    }
 
     for (int i = 0; i < hdr.phnum; ++i) {
         if (phents[i].type != types::elf::elf32_program_header_entry::PT_LOAD)