DF-3693 / analysis.txt
DF-3693 supporting evidence: struct sizes compiled on the guest (cc 8.3,
DragonFly 6.5-DEVELOPMENT) from the packed definitions in
/usr/src/sys/dev/disk/nata/ata-raid.h:
$ ./layout2
sizeof adaptec=8704 magic_3@8448 configs@64 cfg0.total_disks@64 cfg0.type@73 cfg0.stripe_shift@92 cfg0.sectors@88 cfg0.magic_0@68 gen@4
sizeof promise=2048 raid@512 raid.integrity@512 raid.disk_number@517 raid.disk_sectors@532 raid.generation@540 raid.status@542 raid.type@543 raid.total_disks@544 raid.stripe_shift@545 raid.array_width@546 raid.total_sectors@548 raid.disk@564 checksum@2044
sizeof hptv2=512
=> kmalloc'd hptv2 buffer: 512 bytes
=> write length passed to ata_raid_rw: sizeof(struct promise_raid_conf) = 2048 bytes
=> OOB read span persisted to disk: 2048 - 512 = 1536 bytes of adjacent kernel heap
Parser gating (sys/dev/disk/nata/ata-raid.c):
1407 ata_raid_read_metadata(...)
1414 if (devclass == pci_devclass || devclass == atapci_devclass) {
1415 switch (pci_get_vendor(GRANDPARENT(device_get_parent(subdisk)))) {
1416 case ATA_HIGHPOINT_ID:
1417 if (ata_raid_hptv3_read_meta(subdisk, ata_raid_arrays))
1418 return 0;
1419 if (ata_raid_hptv2_read_meta(subdisk, ata_raid_arrays))
1420 return 0;
=> HPTv2 format requires a HighPoint PCI vendor; this guest (Intel PIIX3)
cannot instantiate AR_F_HPTV2_RAID, so the writeback path cannot be
exercised on this hardware. Source analysis stands on its own.
Writeback triggers:
912 ata_raid_config_changed(rdp, writeback)
977 if (rdp->status != status) { writeback = 1; ...
997 if (writeback) ata_raid_write_metadata(rdp);
1487 switch (rdp->format) {
1492 case AR_F_HPTV3_RAID:
1493 case AR_F_HPTV2_RAID:
1498 return ata_raid_hptv2_write_meta(rdp);
4179 ata_raid_config_changed(ars->raid[volume], 1); /* subdisk detach */