protos: Fix misc use-after-close bugs
This commit is contained in:
parent
8d5b1462a4
commit
87ced72dde
|
@ -346,17 +346,17 @@ struct boot_params {
|
|||
// End of Linux code
|
||||
|
||||
void linux_load(char *config, char *cmdline) {
|
||||
struct file_handle *kernel;
|
||||
struct file_handle *kernel_file;
|
||||
|
||||
char *kernel_path = config_get_value(config, 0, "KERNEL_PATH");
|
||||
if (kernel_path == NULL)
|
||||
panic("linux: KERNEL_PATH not specified");
|
||||
|
||||
if ((kernel = uri_open(kernel_path)) == NULL)
|
||||
if ((kernel_file = uri_open(kernel_path)) == NULL)
|
||||
panic("linux: Failed to open kernel with path `%s`. Is the path correct?", kernel_path);
|
||||
|
||||
uint32_t signature;
|
||||
fread(kernel, &signature, 0x202, sizeof(uint32_t));
|
||||
fread(kernel_file, &signature, 0x202, sizeof(uint32_t));
|
||||
|
||||
// validate signature
|
||||
if (signature != 0x53726448) {
|
||||
|
@ -364,7 +364,7 @@ void linux_load(char *config, char *cmdline) {
|
|||
}
|
||||
|
||||
size_t setup_code_size = 0;
|
||||
fread(kernel, &setup_code_size, 0x1f1, 1);
|
||||
fread(kernel_file, &setup_code_size, 0x1f1, 1);
|
||||
|
||||
if (setup_code_size == 0)
|
||||
setup_code_size = 4;
|
||||
|
@ -379,11 +379,11 @@ void linux_load(char *config, char *cmdline) {
|
|||
|
||||
size_t setup_header_end = ({
|
||||
uint8_t x;
|
||||
fread(kernel, &x, 0x201, 1);
|
||||
fread(kernel_file, &x, 0x201, 1);
|
||||
0x202 + x;
|
||||
});
|
||||
|
||||
fread(kernel, setup_header, 0x1f1, setup_header_end - 0x1f1);
|
||||
fread(kernel_file, setup_header, 0x1f1, setup_header_end - 0x1f1);
|
||||
|
||||
printv("linux: Boot protocol: %u.%u\n",
|
||||
setup_header->version >> 8, setup_header->version & 0xff);
|
||||
|
@ -400,7 +400,7 @@ void linux_load(char *config, char *cmdline) {
|
|||
if (verbose) {
|
||||
char *kernel_version = ext_mem_alloc(128);
|
||||
if (setup_header->kernel_version != 0) {
|
||||
fread(kernel, kernel_version, setup_header->kernel_version + 0x200, 128);
|
||||
fread(kernel_file, kernel_version, setup_header->kernel_version + 0x200, 128);
|
||||
print("linux: Kernel version: %s\n", kernel_version);
|
||||
}
|
||||
pmm_free(kernel_version, 128);
|
||||
|
@ -419,13 +419,15 @@ void linux_load(char *config, char *cmdline) {
|
|||
print("linux: Loading kernel `%s`...\n", kernel_path);
|
||||
for (;;) {
|
||||
if (memmap_alloc_range(kernel_load_addr,
|
||||
ALIGN_UP(kernel->size - real_mode_code_size, 4096),
|
||||
ALIGN_UP(kernel_file->size - real_mode_code_size, 4096),
|
||||
MEMMAP_BOOTLOADER_RECLAIMABLE, true, false, false, false))
|
||||
break;
|
||||
|
||||
kernel_load_addr += 0x100000;
|
||||
}
|
||||
fread(kernel, (void *)kernel_load_addr, real_mode_code_size, kernel->size - real_mode_code_size);
|
||||
fread(kernel_file, (void *)kernel_load_addr, real_mode_code_size, kernel_file->size - real_mode_code_size);
|
||||
|
||||
fclose(kernel_file);
|
||||
|
||||
///////////////////////////////////////
|
||||
// Modules
|
||||
|
|
|
@ -37,6 +37,8 @@ void multiboot1_load(char *config, char *cmdline) {
|
|||
|
||||
uint8_t *kernel = freadall(kernel_file, MEMMAP_KERNEL_AND_MODULES);
|
||||
|
||||
size_t kernel_file_size = kernel_file->size;
|
||||
|
||||
fclose(kernel_file);
|
||||
|
||||
struct multiboot1_header header = {0};
|
||||
|
@ -70,7 +72,7 @@ void multiboot1_load(char *config, char *cmdline) {
|
|||
if (header.load_end_addr)
|
||||
load_size = header.load_end_addr - header.load_addr;
|
||||
else
|
||||
load_size = kernel_file->size;
|
||||
load_size = kernel_file_size;
|
||||
|
||||
memmap_alloc_range(header.load_addr, load_size, MEMMAP_KERNEL_AND_MODULES, true, true, false, false);
|
||||
memcpy((void *)(uintptr_t)header.load_addr, kernel + (header_offset
|
||||
|
|
|
@ -92,6 +92,8 @@ void multiboot2_load(char *config, char* cmdline) {
|
|||
|
||||
uint8_t *kernel = freadall(kernel_file, MEMMAP_KERNEL_AND_MODULES);
|
||||
|
||||
size_t kernel_file_size = kernel_file->size;
|
||||
|
||||
fclose(kernel_file);
|
||||
|
||||
struct multiboot_header *header = load_multiboot2_header(kernel);
|
||||
|
@ -190,7 +192,7 @@ void multiboot2_load(char *config, char* cmdline) {
|
|||
if (addresstag->load_end_addr)
|
||||
load_size = addresstag->load_end_addr - addresstag->load_addr;
|
||||
else
|
||||
load_size = kernel_file->size;
|
||||
load_size = kernel_file_size;
|
||||
|
||||
size_t header_offset = (size_t)header - (size_t)kernel;
|
||||
|
||||
|
|
|
@ -92,11 +92,13 @@ void stivale_load(char *config, char *cmdline) {
|
|||
int bits = elf_bits(kernel);
|
||||
bool loaded_by_anchor = false;
|
||||
|
||||
size_t kernel_file_size = kernel_file->size;
|
||||
|
||||
fclose(kernel_file);
|
||||
|
||||
if (bits == -1) {
|
||||
struct stivale_anchor *anchor;
|
||||
if (!stivale_load_by_anchor((void **)&anchor, "STIVALE1 ANCHOR", kernel, kernel_file->size)) {
|
||||
if (!stivale_load_by_anchor((void **)&anchor, "STIVALE1 ANCHOR", kernel, kernel_file_size)) {
|
||||
panic("stivale: Not a valid ELF or anchored file.");
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue