diff options
author | H. Peter Anvin <hpa@zytor.com> | 2008-07-11 01:29:49 -0400 |
---|---|---|
committer | H. Peter Anvin <hpa@zytor.com> | 2008-07-11 01:29:49 -0400 |
commit | 8957c49612075da4b1460843fd86b7d8cacf79ce (patch) | |
tree | 1f165fca394154127edc2b16416f7ab3be7aae10 | |
parent | 81c203f2dd7b46a8126cbb795654e7c206b08502 (diff) | |
download | syslinux-8957c49612075da4b1460843fd86b7d8cacf79ce.tar.gz |
chain.c32: explicitly verify after writing MBRsyslinux-3.71-pre7
If we write the MBR, do verify by reading it back and comparing.
Right now all we do is print an error, though.
-rw-r--r-- | com32/modules/chain.c | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/com32/modules/chain.c b/com32/modules/chain.c index 9fda1c9a..e6409b4e 100644 --- a/com32/modules/chain.c +++ b/com32/modules/chain.c @@ -244,7 +244,7 @@ static int write_sector(unsigned int lba, const void *buf) inreg.esi.w[0] = OFFS(dapa); inreg.ds = SEG(dapa); inreg.edx.b[0] = disk_info.disk; - inreg.eax.b[1] = 0x43; /* Extended write */ + inreg.eax.w[0] = 0x4300; /* Extended write */ } else { unsigned int c, h, s, t; @@ -280,6 +280,22 @@ static int write_sector(unsigned int lba, const void *buf) return 0; /* ok */ } +static int write_verify_sector(unsigned int lba, const void *buf) +{ + char *rb; + int rv; + + rv = write_sector(lba, buf); + if (rv) + return rv; /* Write failure */ + rb = read_sector(lba); + if (!rb) + return -1; /* Readback failure */ + rv = memcmp(buf, rb, SECTOR); + free(rb); + return rv ? -1 : 0; +} + /* Search for a specific drive, based on the MBR signature; bytes 440-443. */ static int find_disk(uint32_t mbr_sig) @@ -621,9 +637,9 @@ static int hide_unhide(char *mbr, int part) } if (write_back) - return write_sector(0, mbr); - else - return 0; /* Nothing to do, return OK */ + return write_verify_sector(0, mbr); + + return 0; /* ok */ } int main(int argc, char *argv[]) |