udf: honor ICB allocation-descriptor type (Short/Long/Extended AD)
read_icb_extents hardcoded an 8-byte Short-AD stride for every file. Large BD-ROM .m2ts streams use 16-byte Long ADs; striding them as Short ADs reads descriptor #0 correctly (length+lba align) but lands #1 in the middle of the first Long AD (its zero impl_use bytes). The AD-list terminator (data_len==0 => break) then fired on that zero and stopped after the first extent, so every multi-extent title truncated at ~1 GiB. The same reader backs read_file, so disc AACS-input files (/AACS/*.inf) and the m2ts mux extents were both affected. Read the ICB Tag flags (AD type) and stride 8/16/20 bytes for Short/Long/ Extended ADs accordingly; Extended ADs carry the lba at off+12. aacs: extract trim_mkb and restore its guard so an MKB whose content length the parser cannot determine (mkb_content_len == 0) is returned intact instead of truncated to empty. Regression tests: Long-AD read_icb_extents returns all extents; Long-AD read_file returns full content; trim_mkb never zeroes an unrecognised MKB.
This commit is contained in:
@@ -34,6 +34,7 @@ pub use keys::{
|
||||
derive_media_key_from_dk, derive_media_key_from_pk, derive_media_key_from_pk_walked,
|
||||
derive_vuk, disc_hash, disc_hash_hex, mkb_content_len, mkb_version, parse_content_cert,
|
||||
parse_unit_key_ro, read_mkb_from_drive, resolve_keys_v1, resolve_keys_v2, resolve_keys_v21,
|
||||
trim_mkb,
|
||||
};
|
||||
pub use provider::KeyProvider;
|
||||
pub use variants::{
|
||||
|
||||
Reference in New Issue
Block a user