@@ -14061,6 +14061,7 @@ struct wuffs_xxhash64__hasher__struct {
14061
14061
14062
14062
// ---------------- Status Codes
14063
14063
14064
+ extern const char wuffs_xz__error__bad_bcj_offset[];
14064
14065
extern const char wuffs_xz__error__bad_block_header[];
14065
14066
extern const char wuffs_xz__error__bad_checksum[];
14066
14067
extern const char wuffs_xz__error__bad_filter[];
@@ -14250,6 +14251,7 @@ struct wuffs_xz__decoder__struct {
14250
14251
} s_decode_block_header_with_padding;
14251
14252
struct {
14252
14253
uint8_t v_flags;
14254
+ uint8_t v_filter_id;
14253
14255
uint32_t v_shift;
14254
14256
uint32_t v_f;
14255
14257
uint64_t scratch;
@@ -69501,6 +69503,7 @@ wuffs_xxhash64__hasher__checksum_u64(
69501
69503
69502
69504
// ---------------- Status Codes Implementations
69503
69505
69506
+ const char wuffs_xz__error__bad_bcj_offset[] = "#xz: bad BCJ offset";
69504
69507
const char wuffs_xz__error__bad_block_header[] = "#xz: bad block header";
69505
69508
const char wuffs_xz__error__bad_checksum[] = "#xz: bad checksum";
69506
69509
const char wuffs_xz__error__bad_filter[] = "#xz: bad filter";
@@ -69552,6 +69555,12 @@ WUFFS_XZ__ZEROES[3] WUFFS_BASE__POTENTIALLY_UNUSED = {
69552
69555
0u, 0u, 0u,
69553
69556
};
69554
69557
69558
+ static const uint8_t
69559
+ WUFFS_XZ__BCJ_OFFSET_ALIGNMENT[12] WUFFS_BASE__POTENTIALLY_UNUSED = {
69560
+ 0u, 0u, 0u, 0u, 1u, 4u, 16u, 4u,
69561
+ 2u, 4u, 4u, 2u,
69562
+ };
69563
+
69555
69564
// ---------------- Private Initializer Prototypes
69556
69565
69557
69566
// ---------------- Private Function Prototypes
@@ -71352,6 +71361,8 @@ wuffs_xz__decoder__decode_block_header_sans_padding(
71352
71361
wuffs_base__status status = wuffs_base__make_status(NULL);
71353
71362
71354
71363
uint8_t v_c8 = 0;
71364
+ uint32_t v_c32 = 0;
71365
+ uint32_t v_alignment = 0;
71355
71366
uint8_t v_flags = 0;
71356
71367
uint8_t v_filter_id = 0;
71357
71368
wuffs_base__status v_status = wuffs_base__make_status(NULL);
@@ -71373,6 +71384,7 @@ wuffs_xz__decoder__decode_block_header_sans_padding(
71373
71384
uint32_t coro_susp_point = self->private_impl.p_decode_block_header_sans_padding;
71374
71385
if (coro_susp_point) {
71375
71386
v_flags = self->private_data.s_decode_block_header_sans_padding.v_flags;
71387
+ v_filter_id = self->private_data.s_decode_block_header_sans_padding.v_filter_id;
71376
71388
v_shift = self->private_data.s_decode_block_header_sans_padding.v_shift;
71377
71389
v_f = self->private_data.s_decode_block_header_sans_padding.v_f;
71378
71390
}
@@ -71575,8 +71587,16 @@ wuffs_xz__decoder__decode_block_header_sans_padding(
71575
71587
*scratch |= ((uint64_t)(num_bits_7)) << 56;
71576
71588
}
71577
71589
}
71578
- self->private_impl.f_bcj_pos = t_7;
71590
+ v_c32 = t_7;
71591
+ }
71592
+ v_alignment = ((uint32_t)(WUFFS_XZ__BCJ_OFFSET_ALIGNMENT[v_filter_id]));
71593
+ if (v_alignment > 0u) {
71594
+ if ((v_c32 % v_alignment) != 0u) {
71595
+ status = wuffs_base__make_status(wuffs_xz__error__bad_bcj_offset);
71596
+ goto exit;
71597
+ }
71579
71598
}
71599
+ self->private_impl.f_bcj_pos = v_c32;
71580
71600
} else {
71581
71601
status = wuffs_base__make_status(wuffs_xz__error__unsupported_filter);
71582
71602
goto exit;
@@ -71643,6 +71663,7 @@ wuffs_xz__decoder__decode_block_header_sans_padding(
71643
71663
suspend:
71644
71664
self->private_impl.p_decode_block_header_sans_padding = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
71645
71665
self->private_data.s_decode_block_header_sans_padding.v_flags = v_flags;
71666
+ self->private_data.s_decode_block_header_sans_padding.v_filter_id = v_filter_id;
71646
71667
self->private_data.s_decode_block_header_sans_padding.v_shift = v_shift;
71647
71668
self->private_data.s_decode_block_header_sans_padding.v_f = v_f;
71648
71669
0 commit comments