it's the same code, so yes, it does.

i'll fix it and commit it if/when this diff gets oked.

dlg

On 02/12/2010, at 3:21 PM, Theo de Raadt wrote:

> i386 doesn't have this bug?
> 
>> the boot loader passes a variable that identifies the disk its
>> booting off made up of a bunch of fields like adapter, controller,
>> disk, and partition offsets, plus a table of all the disks it can
>> see which includes this id and a checksum.
>> 
>> the kernel goes through and checksums the disks and then maps that
>> back to the id associated with that disk, and then compares some
>> of the fields in those ids against the boot disks id to figure out
>> which disk its on.
>> 
>> the problem is we overflow one of those fields (the disk id one).
>> since the other fields are set to 0 by the boot loader, this doesnt
>> really matter that much. however, since those fields are now
>> significant because of the overflow, we should compare them too.
>> 
>> this prevents sd16 being matched as the boot disk after sd0 on my
>> system with 25 disks attached.
>> 
>> sorry if this explanation sucks.
>> 
>> ok?
>> 
>> Index: dkcsum.c
>> ===================================================================
>> RCS file: /cvs/src/sys/arch/amd64/amd64/dkcsum.c,v
>> retrieving revision 1.15
>> diff -u -p -r1.15 dkcsum.c
>> --- dkcsum.c 10 Dec 2008 23:41:19 -0000      1.15
>> +++ dkcsum.c 2 Dec 2010 05:08:25 -0000
>> @@ -71,10 +71,13 @@ dkcsumattach(void)
>> 
>> #ifdef DEBUG
>>      printf("dkcsum: bootdev=%#x\n", bootdev);
>> -    for (bdi = bios_diskinfo; bdi->bios_number != -1; bdi++)
>> -            if (bdi->bios_number & 0x80)
>> -                    printf("dkcsum: BIOS drive %#x checksum is %#x\n",
>> -                        bdi->bios_number, bdi->checksum);
>> +    for (bdi = bios_diskinfo; bdi->bios_number != -1; bdi++) {
>> +            if (bdi->bios_number & 0x80) {
>> +                    printf("dkcsum: BIOS drive %#x bsd_dev=%#x "
>> +                        "checksum=%#x\n", bdi->bios_number, bdi->bsd_dev,
>> +                        bdi->checksum);
>> +            }
>> +    }
>> #endif
>>      pribootdev = altbootdev = 0;
>> 
>> @@ -180,7 +183,9 @@ dkcsumattach(void)
>>               */
>> 
>>              /* B_TYPE dependent hd unit counting bootblocks */
>> -            if ((B_TYPE(bootdev) == B_TYPE(hit->bsd_dev)) &&
>> +            if ((B_ADAPTOR(bootdev) == B_ADAPTOR(hit->bsd_dev)) &&
>> +                (B_CONTROLLER(bootdev) == B_CONTROLLER(hit->bsd_dev)) &&
>> +                (B_TYPE(bootdev) == B_TYPE(hit->bsd_dev)) &&
>>                  (B_UNIT(bootdev) == B_UNIT(hit->bsd_dev))) {
>>                      int type, ctrl, adap, part, unit;

Reply via email to