MCPcopy Create free account
hub / github.com/cgsecurity/testdisk / autoset_geometry

Function autoset_geometry

src/hdaccess.c:1656–1702  ·  view source on GitHub ↗

@ @ requires \valid(disk); @ requires valid_disk(disk); @ requires 0 < disk->geom.heads_per_cylinder <= 255; @ requires 0 < disk->geom.sectors_per_head <= 63; @ requires \valid_read(buffer + (0 .. DEFAULT_SECTOR_SIZE-1)); @ requires separation: \separated(disk, buffer + (0 .. DEFAULT_SECTOR_SIZE-1)); @ decreases 0; @ ensures valid_disk(disk); @*/ assigns disk->geom.cylinders; ass

Source from the content-addressed store, hash-verified

1654// ensures 0 < disk->geom.heads_per_cylinder <= 255;
1655// ensures 0 < disk->geom.sectors_per_head <= 63;
1656static void autoset_geometry(disk_t *disk, const unsigned char *buffer, const int verbose)
1657{
1658 /*@ assert 0 < disk->sector_size; */
1659 if((disk->arch)->get_geometry_from_mbr!=NULL)
1660 {
1661 /*@ assert \valid_function(disk->arch->get_geometry_from_mbr); */
1662 CHSgeometry_t geometry;
1663 geometry.cylinders=0;
1664 geometry.heads_per_cylinder=0;
1665 geometry.sectors_per_head=0;
1666 geometry.bytes_per_sector=0;
1667 disk->arch->get_geometry_from_mbr(buffer, verbose, &geometry);
1668 disk->autodetect=1;
1669 if( geometry.heads_per_cylinder > 0 &&
1670 geometry.heads_per_cylinder <= 255 &&
1671 geometry.sectors_per_head > 0 &&
1672 geometry.sectors_per_head <= 63
1673 )
1674 {
1675 /*@ assert 0 < geometry.heads_per_cylinder <= 255; */
1676 /*@ assert 0 < geometry.sectors_per_head <= 63; */
1677 disk->geom.heads_per_cylinder=geometry.heads_per_cylinder;
1678 disk->geom.sectors_per_head=geometry.sectors_per_head;
1679 /*@ assert 0 < disk->geom.heads_per_cylinder <= 255; */
1680 /*@ assert 0 < disk->geom.sectors_per_head <= 63; */
1681 if(geometry.bytes_per_sector!=0)
1682 {
1683 disk->geom.bytes_per_sector=geometry.bytes_per_sector;
1684 disk->sector_size=geometry.bytes_per_sector;
1685 /*@ assert 0 < disk->sector_size; */
1686 }
1687 /*@ assert 0 < disk->sector_size; */
1688 }
1689 else
1690 {
1691 disk->geom.heads_per_cylinder=255;
1692 disk->geom.sectors_per_head=63;
1693 }
1694 }
1695 /*@ assert 0 < disk->sector_size; */
1696 /*@ assert 0 < disk->geom.heads_per_cylinder <= 255; */
1697 /*@ assert 0 < disk->geom.sectors_per_head <= 63; */
1698 /* Round up because file is often truncated. */
1699 disk->geom.cylinders=(disk->disk_size / disk->sector_size +
1700 (uint64_t)disk->geom.sectors_per_head * disk->geom.heads_per_cylinder - 1) /
1701 disk->geom.sectors_per_head / disk->geom.heads_per_cylinder;
1702}
1703
1704/*@
1705 @ requires \valid_read(hdr);

Callers 2

hdaccess.cFile · 0.85
hd_update_geometryFunction · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected