···225225226226let partitions t = t.partitions
227227228228+(* Security helper: check for int32 addition overflow *)
229229+let int32_add_overflow a b =
230230+ let sum = Int32.add a b in
231231+ (* Overflow if: a > 0 && b > 0 && sum < 0, or a < 0 && b < 0 && sum > 0 *)
232232+ (* For unsigned interpretation, check if sum < a when both are positive *)
233233+ Int32.unsigned_compare sum a < 0
234234+228235let make ?(disk_signature = 0l) partitions =
229236 let* () =
230237 if List.length partitions <= 4 then Ok () else Error "Too many partitions"
···237244 let* () =
238245 if num_active <= 1 then Ok ()
239246 else Error "More than one active/boot partitions is not advisable"
247247+ in
248248+ (* Security: validate partition start + size doesn't overflow *)
249249+ let* () =
250250+ List.fold_left
251251+ (fun r p ->
252252+ let* () = r in
253253+ if
254254+ int32_add_overflow p.Partition.first_absolute_sector_lba
255255+ p.Partition.sectors
256256+ then
257257+ Error
258258+ (Printf.sprintf "Partition start %lu + size %lu overflows int32"
259259+ p.Partition.first_absolute_sector_lba p.Partition.sectors)
260260+ else Ok ())
261261+ (Ok ()) partitions
240262 in
241263 let partitions =
242264 List.sort