Kernel: Read file modes from the initrd, filtering out write permissions
This commit is contained in:
parent
a2d9ada4dc
commit
e05f3f5325
@ -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();
|
||||||
|
@ -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));
|
||||||
|
Loading…
Reference in New Issue
Block a user