Stephen O'Donnell created HDDS-15480:
----------------------------------------
Summary: Potential for NPE / infinite loop in StreamBlockReader
Key: HDDS-15480
URL: https://issues.apache.org/jira/browse/HDDS-15480
Project: Apache Ozone
Issue Type: Sub-task
Reporter: Stephen O'Donnell
Assignee: Stephen O'Donnell
There is potential for an NPE at stream shutdown in the StreamBlockReader:
poll() explicitly returns null when future.isDone() is true (stream completed).
However readFromQueue() uses the return value without a null check:
{code}
// StreamingReader.readFromQueue(), line 455-459
ByteBuffer readFromQueue() throws IOException {
final ReadBlockResponseProto readBlock = poll(); // can return null
final ByteString data = readBlock.getData(); // NPE!
{code}
This fires in the normal shutdown path: after the server sends the last chunk
and closes the stream, the next poll() call returns null and this line throws
NullPointerException instead of letting the caller handle EOF gracefully.
Fixing this, can then cause an infinite loop in StreamingReader.read() (lines
446-451)
The inner read loop has no exit when readFromQueue() returns null or an empty
buffer:
{code}
while (true) {
final ByteBuffer buf = readFromQueue();
if (buf != null && buf.hasRemaining()) {
return buf; // only exit
}
// else: loop forever
}
{code}
This could happen when:
- Stream ends: once Bug 1 is fixed so readFromQueue() can return null, this
loop spins forever on null.
- Full offset skip: readFromQueue() adjusts the buffer position by pos -
blockOffset. If the entire response arrived before the current position (e.g.
after a seek, or when reading near the end of a small block), the adjusted
buffer has 0 remaining bytes. The loop spins indefinitely without requesting
new data, because readBlock() is only called once before the loop starts.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]