Kernel: Read file modes from the initrd, filtering out write permissions

This commit is contained in:
apio 2022-10-28 20:52:10 +02:00
parent a2d9ada4dc
commit e05f3f5325
2 changed files with 10 additions and 1 deletions

View File

@ -1,5 +1,6 @@
#pragma once #pragma once
#include <stdint.h> #include <stdint.h>
#include <sys/types.h>
#define TAR_MAGIC "ustar" #define TAR_MAGIC "ustar"
#define TAR_BLOCKSIZE 512 #define TAR_BLOCKSIZE 512
@ -33,6 +34,7 @@ namespace InitRD
uint64_t size; uint64_t size;
uint64_t size_in_blocks; uint64_t size_in_blocks;
void* addr; void* addr;
mode_t mode;
}; };
uint64_t get_total_blocks(); uint64_t get_total_blocks();

View File

@ -62,6 +62,13 @@ InitRD::File InitRD::get_file(TarHeader* header)
} }
result.addr = (void*)((uint64_t)header + TAR_BLOCKSIZE); result.addr = (void*)((uint64_t)header + TAR_BLOCKSIZE);
result.size_in_blocks = Utilities::get_blocks_from_size(TAR_BLOCKSIZE, result.size); result.size_in_blocks = Utilities::get_blocks_from_size(TAR_BLOCKSIZE, result.size);
result.mode = 0;
multiplier = 1;
for (int i = 6; i >= 0; i--)
{
result.mode += (mode_t)(multiplier * (header->mode[i] - 48));
multiplier *= 8;
}
return result; return result;
} }
@ -345,7 +352,7 @@ static bool initrd_register_file(InitRD::File& f, uint64_t inode)
node.read_func = initrd_read; node.read_func = initrd_read;
node.length = f.size; node.length = f.size;
node.type = VFS_FILE; node.type = VFS_FILE;
node.mode = 0555; node.mode = f.mode & 07555; // don't allow writing
node.uid = node.gid = 0; node.uid = node.gid = 0;
strncpy(node.name, buffer, sizeof(node.name)); strncpy(node.name, buffer, sizeof(node.name));
strncpy(f.name, buffer, sizeof(f.name)); strncpy(f.name, buffer, sizeof(f.name));