bootboot: Fix spec compliance as noted in PR #124 comments

This commit is contained in:
mintsuki 2021-11-09 00:32:05 +01:00
parent 0c073fcc44
commit 1be24c3cbe

View File

@ -9,26 +9,8 @@ INITRD_HANDLER(jamesm);
INITRD_HANDLER(ustar);
INITRD_HANDLER(cpio);
#define DETECT_FAILED panic("bootboot: cannot read file `%s`: cannot detect initrd type (only ustar, cpio and jamesm is supported).", path)
INITRD_HANDLER(auto) {
if (file.size < 4) {
DETECT_FAILED;
}
if (!memcmp(file.data, "\177ELF", 4)) {
if (strcmp("sys/core", path) == 0) {
printv("bootboot: using ELF as initrd to open sys/core\n");
return file;
}
return (struct initrd_file){0};
}
if (file.size < 5) {
DETECT_FAILED;
}
if (file.data[4] == 0xBF) {
if (file.size >= 5 && file.data[4] == 0xbf) {
struct initrd_file jamesm_attempt = initrd_open_jamesm(file, path);
if (jamesm_attempt.data) {
printv("bootboot: jamesm matched when reading file `%s`\n", path);
@ -37,7 +19,7 @@ INITRD_HANDLER(auto) {
panic("bootboot: cannot read file `%s`: no such file or directory", path);
}
if (!memcmp("07070", file.data, 5)) {
if (file.size >= 5 && memcmp("07070", file.data, 5) == 0) {
struct initrd_file cpio_attempt = initrd_open_cpio(file, path);
if (cpio_attempt.data) {
printv("bootboot: cpio matched when reading file `%s`\n", path);
@ -46,11 +28,7 @@ INITRD_HANDLER(auto) {
panic("bootboot: cannot read file `%s`: no such file or directory", path);
}
if (file.size < 262) {
DETECT_FAILED;
}
if (!memcmp("ustar", file.data + 257, 5)) {
if (file.size >= 262 && memcmp("ustar", file.data + 257, 5) == 0) {
struct initrd_file ustar_attempt = initrd_open_ustar(file, path);
if (ustar_attempt.data) {
printv("bootboot: ustar matched when reading file `%s`\n", path);
@ -59,5 +37,17 @@ INITRD_HANDLER(auto) {
panic("bootboot: cannot read file `%s`: no such file or directory", path);
}
DETECT_FAILED;
if (strcmp("sys/core", path) == 0) {
for (size_t i = 0; i < file.size; i += 4) {
if (memcmp(file.data + i, "\177ELF", 4) == 0) {
printv("bootboot: using ELF as initrd to open sys/core\n");
return (struct initrd_file){
.size = file.size - i,
.data = file.data + i
};
}
}
}
panic("bootboot: cannot read file `%s`: cannot detect initrd type (only ustar, cpio and jamesm is supported).", path);
}