makebootable: fix check for BFS signature when using start-offset option

For example when building a VMDK image in Haiku build.

Fixes #19891.

Change-Id: I2666083b074b20b3da2f53999a9abd116ce31603
Reviewed-on: https://review.haiku-os.org/c/haiku/+/10230
Tested-by: Commit checker robot <[email protected]>
Reviewed-by: Adrien Destugues <[email protected]>
This commit is contained in:
PulkoMandy
2026-01-17 14:25:55 +00:00
committed by Adrien Destugues
parent 3e6f397911
commit 6e452cc1ea
@@ -180,10 +180,10 @@ read_boot_code_data(const char* programPath)
static bool
is_bfs_partition(int fd)
is_bfs_partition(int fd, off_t offset)
{
unsigned char bootblock[512];
read_pos(fd, 512, &bootblock, sizeof(bootblock));
read_pos(fd, offset + 512, &bootblock, sizeof(bootblock));
uint32 magic1 = *(uint32*)(bootblock + 0x20);
uint32 magic2 = *(uint32*)(bootblock + 0x44);
uint32 magic3 = *(uint32*)(bootblock + 0x70);
@@ -200,10 +200,10 @@ is_bfs_partition(int fd)
static bool
is_bootcode_installed(int fd, const uint8* bootCode, int64* out_partition_offset)
is_bootcode_installed(int fd, off_t offset, const uint8* bootCode, int64* out_partition_offset)
{
unsigned char bootblock[kBootCodeSize];
read_pos(fd, 0, &bootblock, kBootCodeSize);
read_pos(fd, offset, &bootblock, kBootCodeSize);
// Check if first part of bootcode is identical up until the partition offset
if (memcmp(bootblock, bootCode, kPartitionOffsetOffset) != 0)
@@ -658,7 +658,7 @@ main(int argc, const char *const *argv)
#endif // HAIKU_TARGET_PLATFORM_HAIKU
bool isBfs = is_bfs_partition(fd);
bool isBfs = is_bfs_partition(fd, startOffset);
if (!isBfs) {
fprintf(stderr, "Error: %s is not a BFS partition.\n", fileName);
exit(1);
@@ -670,7 +670,7 @@ main(int argc, const char *const *argv)
= B_HOST_TO_LENDIAN_INT32((uint32)(partitionOffset / 512));
int64 oldPartitionOffset = 0;
bool bootCodeAlreadyInstalled = is_bootcode_installed(fd, bootCodeData,
bool bootCodeAlreadyInstalled = is_bootcode_installed(fd, startOffset, bootCodeData,
&oldPartitionOffset);
if (bootCodeAlreadyInstalled && (partitionOffset == oldPartitionOffset * 512)) {