Check that extra-field types aren't refined
diff --git a/lang/parse/parse.go b/lang/parse/parse.go
index 0a30c24..7c2e1b8 100644
--- a/lang/parse/parse.go
+++ b/lang/parse/parse.go
@@ -342,7 +342,21 @@
}
func (p *parser) parseExtraFieldNode() (*a.Node, error) {
- return p.parseFieldNode1(a.FlagsPrivateData)
+ n, err := p.parseFieldNode1(a.FlagsPrivateData)
+ if err != nil {
+ return nil, err
+ }
+ typ := n.AsField().XType()
+ for typ.Decorator() == t.IDArray {
+ typ = typ.Inner()
+ }
+ if (typ.Decorator() != 0) ||
+ (typ.QID()[0] == t.IDBase) && (!typ.IsNumType() || typ.IsRefined()) {
+
+ return nil, fmt.Errorf(`parse: invalid extra-field type %q at %s:%d`,
+ n.AsField().XType().Str(p.tm), p.filename, p.line())
+ }
+ return n, nil
}
func (p *parser) parseFieldNode1(flags a.Flags) (*a.Node, error) {
diff --git a/release/c/wuffs-unsupported-snapshot.c b/release/c/wuffs-unsupported-snapshot.c
index 799fe09..a4ebb28 100644
--- a/release/c/wuffs-unsupported-snapshot.c
+++ b/release/c/wuffs-unsupported-snapshot.c
@@ -6930,7 +6930,9 @@
status = v_status;
goto exit;
}
- v_mask = ((((uint32_t)(1)) << self->private_data.f_n_huffs_bits[0]) - 1);
+ v_mask = ((((uint32_t)(1)) << wuffs_base__u32__min(
+ self->private_data.f_n_huffs_bits[0], 9)) -
+ 1);
v_i = 0;
label_0_continue:;
while (v_i < (v_n_lit + v_n_dist)) {
@@ -6975,7 +6977,7 @@
status = wuffs_deflate__error__bad_huffman_code_length_repetition;
goto exit;
}
- v_rep_symbol = self->private_data.f_code_lengths[(v_i - 1)];
+ v_rep_symbol = (self->private_data.f_code_lengths[(v_i - 1)] & 15);
v_rep_count = 3;
} else if (v_table_entry == 17) {
v_n_extra_bits = 3;
@@ -7104,10 +7106,10 @@
v_i = a_n_codes0;
while (v_i < a_n_codes1) {
- if (v_counts[self->private_data.f_code_lengths[v_i]] >= 320) {
+ if (v_counts[(self->private_data.f_code_lengths[v_i] & 15)] >= 320) {
return wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state;
}
- v_counts[self->private_data.f_code_lengths[v_i]] += 1;
+ v_counts[(self->private_data.f_code_lengths[v_i] & 15)] += 1;
v_i += 1;
}
if ((((uint32_t)(v_counts[0])) + a_n_codes0) == a_n_codes1) {
@@ -7148,12 +7150,12 @@
return wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state;
}
if (self->private_data.f_code_lengths[v_i] != 0) {
- if (v_offsets[self->private_data.f_code_lengths[v_i]] >= 320) {
+ if (v_offsets[(self->private_data.f_code_lengths[v_i] & 15)] >= 320) {
return wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state;
}
- v_symbols[v_offsets[self->private_data.f_code_lengths[v_i]]] =
+ v_symbols[v_offsets[(self->private_data.f_code_lengths[v_i] & 15)]] =
((uint16_t)((v_i - a_n_codes0)));
- v_offsets[self->private_data.f_code_lengths[v_i]] += 1;
+ v_offsets[(self->private_data.f_code_lengths[v_i] & 15)] += 1;
}
v_i += 1;
}
@@ -7196,8 +7198,9 @@
if (v_max_cl < 9) {
v_initial_high_bits = (((uint32_t)(1)) << v_max_cl);
}
- v_prev_cl = ((uint32_t)(self->private_data.f_code_lengths[(
- a_n_codes0 + ((uint32_t)(v_symbols[0])))]));
+ v_prev_cl = ((uint32_t)((self->private_data.f_code_lengths[(
+ a_n_codes0 + ((uint32_t)(v_symbols[0])))] &
+ 15)));
v_prev_redirect_key = 4294967295;
v_top = 0;
v_next_top = 512;
@@ -7208,8 +7211,9 @@
if ((a_n_codes0 + ((uint32_t)(v_symbols[v_i]))) >= 320) {
return wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state;
}
- v_cl = ((uint32_t)(self->private_data.f_code_lengths[(
- a_n_codes0 + ((uint32_t)(v_symbols[v_i])))]));
+ v_cl = ((uint32_t)((self->private_data.f_code_lengths[(
+ a_n_codes0 + ((uint32_t)(v_symbols[v_i])))] &
+ 15)));
if (v_cl > v_prev_cl) {
v_code <<= (v_cl - v_prev_cl);
if (v_code >= 32768) {
@@ -7362,8 +7366,12 @@
}
v_bits = self->private_impl.f_bits;
v_n_bits = self->private_impl.f_n_bits;
- v_lmask = ((((uint32_t)(1)) << self->private_data.f_n_huffs_bits[0]) - 1);
- v_dmask = ((((uint32_t)(1)) << self->private_data.f_n_huffs_bits[1]) - 1);
+ v_lmask = ((((uint32_t)(1)) << wuffs_base__u32__min(
+ self->private_data.f_n_huffs_bits[0], 9)) -
+ 1);
+ v_dmask = ((((uint32_t)(1)) << wuffs_base__u32__min(
+ self->private_data.f_n_huffs_bits[1], 9)) -
+ 1);
label_0_continue:;
while ((((uint64_t)(io1_a_dst - iop_a_dst)) >= 258) &&
(((uint64_t)(io1_a_src - iop_a_src)) >= 12)) {
@@ -7699,8 +7707,12 @@
}
v_bits = self->private_impl.f_bits;
v_n_bits = self->private_impl.f_n_bits;
- v_lmask = ((((uint32_t)(1)) << self->private_data.f_n_huffs_bits[0]) - 1);
- v_dmask = ((((uint32_t)(1)) << self->private_data.f_n_huffs_bits[1]) - 1);
+ v_lmask = ((((uint32_t)(1)) << wuffs_base__u32__min(
+ self->private_data.f_n_huffs_bits[0], 9)) -
+ 1);
+ v_dmask = ((((uint32_t)(1)) << wuffs_base__u32__min(
+ self->private_data.f_n_huffs_bits[1], 9)) -
+ 1);
label_0_continue:;
while (!(self->private_impl.p_decode_huffman_slow[0] != 0)) {
while (true) {
@@ -8370,7 +8382,7 @@
}
v_steps -= 1;
v_o = ((v_o - 8) & 8191);
- v_c = ((uint32_t)(self->private_data.f_prefixes[v_c]));
+ v_c = (((uint32_t)(self->private_data.f_prefixes[v_c])) & 4095);
}
label_1_break:;
v_first_byte = self->private_data.f_suffixes[v_c][0];
diff --git a/std/deflate/decode_deflate.wuffs b/std/deflate/decode_deflate.wuffs
index ef3c19c..782bafc 100644
--- a/std/deflate/decode_deflate.wuffs
+++ b/std/deflate/decode_deflate.wuffs
@@ -107,7 +107,7 @@
//
// Exactly one of the eight bits 31-24 should be set.
huffs array[2] array[huffs_table_size] base.u32,
- n_huffs_bits array[2] base.u32[..9],
+ n_huffs_bits array[2] base.u32,
// history holds up to the last 32KiB of decoded output, if the decoding
// was incomplete (e.g. due to a short read or write). RFC 1951 (DEFLATE)
@@ -126,7 +126,7 @@
//
// code_lengths[args.n_codes0 + i] holds the number of bits in the i'th
// code.
- code_lengths array[320] base.u8[..15],
+ code_lengths array[320] base.u8,
)
pub func decoder.workbuf_len() base.range_ii_u64 {
@@ -389,7 +389,7 @@
}
// Decode the code lengths for the next two Huffman tables.
- mask = ((1 as base.u32) << this.n_huffs_bits[0]) - 1
+ mask = ((1 as base.u32) << (this.n_huffs_bits[0].min(x:9))) - 1
i = 0
while i < (n_lit + n_dist) {
assert i < (288 + 32) via "a < (b + c): a < (b0 + c0); b0 <= b; c0 <= c"(b0:n_lit, c0:n_dist)
@@ -433,7 +433,7 @@
if i <= 0 {
return "?bad Huffman code length repetition"
}
- rep_symbol = this.code_lengths[i - 1]
+ rep_symbol = this.code_lengths[i - 1] & 15
rep_count = 3
assert rep_count <= 11
} else if table_entry == 17 {
@@ -561,10 +561,10 @@
assert i < 320 via "a < b: a < c; c <= b"(c:args.n_codes1)
// TODO: this if should be unnecessary. Have some way to assert that,
// for all j, counts[j] <= i, and thus counts[j]++ will not overflow.
- if counts[this.code_lengths[i]] >= 320 {
+ if counts[this.code_lengths[i] & 15] >= 320 {
return "?internal error: inconsistent Huffman decoder state"
}
- counts[this.code_lengths[i]] += 1
+ counts[this.code_lengths[i] & 15] += 1
i += 1
}
if ((counts[0] as base.u32) + args.n_codes0) == args.n_codes1 {
@@ -648,11 +648,11 @@
return "?internal error: inconsistent Huffman decoder state"
}
if this.code_lengths[i] != 0 {
- if offsets[this.code_lengths[i]] >= 320 {
+ if offsets[this.code_lengths[i] & 15] >= 320 {
return "?internal error: inconsistent Huffman decoder state"
}
- symbols[offsets[this.code_lengths[i]]] = (i - args.n_codes0) as base.u16
- offsets[this.code_lengths[i]] += 1
+ symbols[offsets[this.code_lengths[i] & 15]] = (i - args.n_codes0) as base.u16
+ offsets[this.code_lengths[i] & 15] += 1
}
i += 1
}
@@ -718,7 +718,7 @@
if max_cl < 9 {
initial_high_bits = (1 as base.u32) << max_cl
}
- prev_cl = this.code_lengths[args.n_codes0 + (symbols[0] as base.u32)] as base.u32
+ prev_cl = (this.code_lengths[args.n_codes0 + (symbols[0] as base.u32)] & 15) as base.u32
prev_redirect_key = 0xFFFFFFFF
top = 0
next_top = 512
@@ -733,7 +733,7 @@
if (args.n_codes0 + (symbols[i] as base.u32)) >= 320 {
return "?internal error: inconsistent Huffman decoder state"
}
- cl = this.code_lengths[args.n_codes0 + (symbols[i] as base.u32)] as base.u32
+ cl = (this.code_lengths[args.n_codes0 + (symbols[i] as base.u32)] & 15) as base.u32
if cl > prev_cl {
code <<= cl - prev_cl
if code >= (1 << 15) {
diff --git a/std/deflate/decode_huffman_fast.wuffs b/std/deflate/decode_huffman_fast.wuffs
index e0428d8..55cd340 100644
--- a/std/deflate/decode_huffman_fast.wuffs
+++ b/std/deflate/decode_huffman_fast.wuffs
@@ -41,8 +41,8 @@
bits = this.bits
n_bits = this.n_bits
- lmask = ((1 as base.u32) << this.n_huffs_bits[0]) - 1
- dmask = ((1 as base.u32) << this.n_huffs_bits[1]) - 1
+ lmask = ((1 as base.u32) << this.n_huffs_bits[0].min(x:9)) - 1
+ dmask = ((1 as base.u32) << this.n_huffs_bits[1].min(x:9)) - 1
// Check up front, on each iteration, that we have enough buffer space to
// both read (12 bytes) and write (258 bytes) as much as we need to. Doing
diff --git a/std/deflate/decode_huffman_slow.wuffs b/std/deflate/decode_huffman_slow.wuffs
index a18a98e..4d94fdb 100644
--- a/std/deflate/decode_huffman_slow.wuffs
+++ b/std/deflate/decode_huffman_slow.wuffs
@@ -45,8 +45,8 @@
bits = this.bits
n_bits = this.n_bits
- lmask = ((1 as base.u32) << this.n_huffs_bits[0]) - 1
- dmask = ((1 as base.u32) << this.n_huffs_bits[1]) - 1
+ lmask = ((1 as base.u32) << this.n_huffs_bits[0].min(x:9)) - 1
+ dmask = ((1 as base.u32) << this.n_huffs_bits[1].min(x:9)) - 1
while:loop not coroutine_resumed {
// Decode an lcode symbol from H-L.
diff --git a/std/lzw/decode_lzw.wuffs b/std/lzw/decode_lzw.wuffs
index 76316c9..04469c3 100644
--- a/std/lzw/decode_lzw.wuffs
+++ b/std/lzw/decode_lzw.wuffs
@@ -57,10 +57,10 @@
)(
// read_from per-code state.
suffixes array[4096] array[8] base.u8,
- prefixes array[4096] base.u16[..4095],
+ prefixes array[4096] base.u16,
// lm1s is the "length minus 1"s of the values for the implicit key-value
// table in this decoder. See std/lzw/README.md for more detail.
- lm1s array[4096] base.u16[..4095],
+ lm1s array[4096] base.u16,
// output[output_ri:output_wi] is the buffered output, connecting read_from
// with write_to and flush.
@@ -199,7 +199,7 @@
this.output[output_wi] = code as base.u8
output_wi = (output_wi + 1) & 8191
if save_code <= 4095 {
- lm1_a = (this.lm1s[prev_code] + 1) & 4095
+ lm1_a = (this.lm1s[prev_code] ~mod+ 1) & 4095
this.lm1s[save_code] = lm1_a
if (lm1_a % 8) != 0 {
@@ -262,7 +262,7 @@
// This line is essentially "o -= 8". The "& 8191" is a no-op
// in practice, but is necessary for the overflow checker.
o = (o ~mod- 8) & 8191
- c = this.prefixes[c] as base.u32
+ c = (this.prefixes[c] as base.u32) & 4095
}
first_byte = this.suffixes[c][0]
@@ -272,7 +272,7 @@
}
if save_code <= 4095 {
- lm1_b = (this.lm1s[prev_code] + 1) & 4095
+ lm1_b = (this.lm1s[prev_code] ~mod+ 1) & 4095
this.lm1s[save_code] = lm1_b
if (lm1_b % 8) != 0 {