Of course your right, we leaked here.  Shouldn't we also wrap the for loop above in a try/finally so that if we hit the IOException "Early EOF" above we still don't leak the file handle?

Better, we can just replace the entire method with our IO.readFully() method....  I'll post a patch in a second.