Copilot commented on code in PR #3861:
URL: https://github.com/apache/avro/pull/3861#discussion_r3567637143
##########
lang/py/avro/io.py:
##########
@@ -832,24 +1054,43 @@ def read_map(self, writers_schema:
avro.schema.MapSchema, readers_schema: avro.s
The actual count in this case
is the absolute value of the count written.
"""
- read_items = {}
+ read_items: Dict[str, object] = {}
+ # Map keys are strings (>= 1 byte length prefix) plus the value.
+ min_bytes = 1 + _min_bytes_per_element(writers_schema.values)
+ zero_byte_limit, structural_limit = _collection_limits()
+ # Track decoded pairs separately: len(read_items) counts unique keys,
so
+ # duplicate keys (later entries overwrite earlier ones) would
undercount
+ # and let a multi-block map exceed the cumulative caps.
+ items_read = 0
block_count = decoder.read_long()
while block_count != 0:
if block_count < 0:
block_count = -block_count
decoder.skip_long()
Review Comment:
Same as `read_array()`: the negative-count map block byte-size is currently
skipped with `decoder.skip_long()`, which lacks the 10-byte/64-bit varint
validation in `read_long()`. Reading it with `read_long()` (and discarding the
value) ensures malformed overlong encodings are rejected rather than looped
over.
##########
lang/py/avro/io.py:
##########
@@ -795,23 +981,59 @@ def read_array(self, writers_schema:
avro.schema.ArraySchema, readers_schema: av
The actual count in this case
is the absolute value of the count written.
"""
- read_items = []
+ read_items: List[object] = []
+ min_bytes = _min_bytes_per_element(writers_schema.items)
+ zero_byte_limit, structural_limit = _collection_limits()
block_count = decoder.read_long()
while block_count != 0:
if block_count < 0:
block_count = -block_count
decoder.skip_long()
Review Comment:
In the negative-block-count path, the block byte-size is consumed via
`decoder.skip_long()`, which does not enforce the new 10-byte/64-bit varint
bounds from `read_long()`. A malformed overlong varint here can cause excessive
looping/CPU and also bypasses strict encoding validation. Prefer consuming the
value with `read_long()` (and ignore it) so malformed encodings are rejected
consistently.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]