On Sat, Oct 06, 2018 at 09:41:27PM +0300, Eugene Korenevsky wrote: > > is_gpt_valid() already contains > > pt_size = (u64)le32_to_cpu((*gpt)->num_partition_entries) * > > le32_to_cpu((*gpt)->sizeof_partition_entry); > > if (pt_size > KMALLOC_MAX_SIZE) > > pr_debug("GUID Partition Table is too large: %llu > %lu bytes\n", > > (unsigned long long)pt_size, KMALLOC_MAX_SIZE); > > goto fail; > > } > > I guess it good enough for sanity check. > > > > If you want to be really paranoid than you can also check that array > > is possible to store to the expected area on the disk: > > > > pt_size <= (gpt->first_usable_lba - gpt->partition_entry_lba) > > > > Well, we should apply several checks for different cases: > - primary GPT: table entries should not override gpt->first_usable_lba and gpt->last_usable_lba > - alternate GPT, table entries BEFORE agpt (agpt->partition_entry_lba > < agpt_lba): table entries should not override agpt_lba AND > agpt->partition_entry_lba MUST BE more than agpt->last_usable_lba > - alternate GPT, table entries AFTER agpt (agpt->partition_entry_lba > > agpt_lba): table entries should not override the end of the disk > > Is this correct? Yes, the table defines range for all partitions (last and first usable LBA). All partition table stuff (label and partitions array) has to be outside this area and partitions have to point to this area. | label | entries | partitioned area | backup-entries | backup-label | ^ ^ first_usable_lba last_usable_lba and it's possible and valid if there is gap between entries array and first usable LBA (you can use this unused place to hide same data :-) And vice-versa for backup entries and last usable LBA. Karel -- Karel Zak <kzak@xxxxxxxxxx> http://karelzak.blogspot.com