bin/98005: loader corrupts other files when rewriting
nextboot.conf
Ian Dowse
iedowse at iedowse.com
Sat May 27 05:11:45 PDT 2006
The following reply was made to PR bin/98005; it has been noted by GNATS.
From: Ian Dowse <iedowse at iedowse.com>
To: Yar Tikhiy <yar at comp.chem.msu.su>
Cc: FreeBSD-gnats-submit at FreeBSD.org
Subject: Re: bin/98005: loader corrupts other files when rewriting nextboot.conf
Date: Sat, 27 May 2006 13:05:01 +0100
In message <200605271037.k4RAbtYw063346 at comp.chem.msu.su>, Yar Tikhiy writes:
> When nextboot is in effect, loader(8) writes the modified
> contents of the nextboot.conf file, or whatever nextboot_conf
> is set to, to an incorrect location on the disk. The
> location overwritten is in the block after the one actually
> belonging to the nextboot.conf file.
>
> This problem is likely to be caused by an off-by-one bug in
> the stand-alone FS access library used by loader(8).
You could try the following (I haven't tested it), but it's pretty
obvious how the bug happened if you compare bd_write() with the
bd_read() function that it was copied from. Looks like the author
of bd_write() was more interested in writing a little song in the
comments than writing to the correct part of the disk ;-)
The bug probably wasn't noticed originally because it only affected
the LBA access case.
Ian
Index: i386/libi386/biosdisk.c
===================================================================
RCS file: /dump/FreeBSD-CVS/src/sys/boot/i386/libi386/biosdisk.c,v
retrieving revision 1.46
diff -u -r1.46 biosdisk.c
--- i386/libi386/biosdisk.c 19 Dec 2005 09:00:11 -0000 1.46
+++ i386/libi386/biosdisk.c 27 May 2006 11:53:34 -0000
@@ -1037,9 +1037,6 @@
*/
if (bbuf != NULL)
bcopy(p, breg, x * BIOSDISK_SECSIZE);
- p += (x * BIOSDISK_SECSIZE);
- dblk += x;
- resid -= x;
/* Loop retrying the operation a couple of times. The BIOS may also retry. */
for (retry = 0; retry < 3; retry++) {
@@ -1103,6 +1100,9 @@
if (result) {
return(-1);
}
+ p += (x * BIOSDISK_SECSIZE);
+ dblk += x;
+ resid -= x;
}
/* hexdump(dest, (blks * BIOSDISK_SECSIZE)); */
More information about the freebsd-bugs
mailing list