Ismaël Mejía created AVRO-4324:
----------------------------------
Summary: [Java] Align ReflectDatumReader.readArray with
GenericDatumReader eager-allocation guards for malformed input
Key: AVRO-4324
URL: https://issues.apache.org/jira/browse/AVRO-4324
Project: Apache Avro
Issue Type: Improvement
Components: java
Reporter: Ismaël Mejía
{{GenericDatumReader.readArray}} was already made robust against malformed or
truncated input: it clamps the initial backing allocation
({{initialCollectionCapacity}}), validates the declared array block count
against the bytes actually remaining ({{ensureAvailableCollectionBytes}}), and
applies a heap-aware bound for element types whose minimum encoded size is zero.
The {{ReflectDatumReader.readArray}} override does not apply these guards. It
calls {{newArray(old, (int) l, ...)}} -> {{Array.newInstance(elementClass,
count)}} using the declared array block count directly, so a malformed record
mapped to a Java array field (for example a {{long[]}}) can drive a large eager
allocation before a single element is read.
We should bring {{ReflectDatumReader.readArray}} in line with the generic
reader by applying the same {{ensureAvailableCollectionBytes}} /
collection-allocation checks and clamping the initial allocation, so malformed
input fails fast (e.g. {{EOFException}}) instead of over-allocating. A valid
array continues to read normally.
Relevant code:
*
{{lang/java/avro/src/main/java/org/apache/avro/reflect/ReflectDatumReader.java}}
— {{readArray(...)}} and {{newArray(...)}} ({{Array.newInstance}}).
*
{{lang/java/avro/src/main/java/org/apache/avro/generic/GenericDatumReader.java}}
— {{readArray(...)}}, {{ensureAvailableCollectionBytes(...)}},
{{initialCollectionCapacity(...)}} as the reference implementation.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)