OpenPgpMessageInputStream: Return -1 instead of throwing MalformedOpenPgpMessageException when calling read() on drained stream

This commit is contained in:
Paul Schaub 2023-05-01 09:35:28 +02:00
parent 558036c485
commit 52fa7e4d46
Signed by: vanitasvitae
GPG Key ID: 62BEE9264BF17311
3 changed files with 23 additions and 0 deletions

View File

@ -744,6 +744,7 @@ public class OpenPgpMessageInputStream extends DecryptionStream {
throws IOException {
if (nestedInputStream == null) {
if (packetInputStream != null) {
syntaxVerifier.next(InputSymbol.EndOfSequence);
syntaxVerifier.assertValid();
}
return -1;
@ -774,6 +775,7 @@ public class OpenPgpMessageInputStream extends DecryptionStream {
super.close();
if (closed) {
if (packetInputStream != null) {
syntaxVerifier.next(InputSymbol.EndOfSequence);
syntaxVerifier.assertValid();
}
return;

View File

@ -132,6 +132,10 @@ public class OpenPgpMessageSyntax implements Syntax {
@Nonnull
Transition fromValid(@Nonnull InputSymbol input, @Nullable StackSymbol stackItem)
throws MalformedOpenPgpMessageException {
if (input == InputSymbol.EndOfSequence) {
// allow subsequent read() calls.
return new Transition(State.Valid);
}
// There is no applicable transition rule out of Valid
throw new MalformedOpenPgpMessageException(State.Valid, input, stackItem);
}

View File

@ -34,6 +34,7 @@ import org.bouncycastle.openpgp.PGPSignature;
import org.bouncycastle.util.io.Streams;
import org.junit.JUtils;
import org.junit.jupiter.api.Named;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;
@ -652,6 +653,22 @@ public class OpenPgpMessageInputStreamTest {
assertTrue(metadata.getRejectedInlineSignatures().isEmpty());
}
@Test
public void readAfterCloseTest() throws PGPException, IOException {
OpenPgpMessageInputStream pgpIn = get(SENC_LIT, ConsumerOptions.get()
.addDecryptionPassphrase(Passphrase.fromPassword(PASSPHRASE)));
Streams.drain(pgpIn); // read all
byte[] buf = new byte[1024];
assertEquals(-1, pgpIn.read(buf));
assertEquals(-1, pgpIn.read());
assertEquals(-1, pgpIn.read(buf));
assertEquals(-1, pgpIn.read());
pgpIn.close();
pgpIn.getMetadata();
}
private static Tuple<String, MessageMetadata> processReadBuffered(String armoredMessage, ConsumerOptions options)
throws PGPException, IOException {
OpenPgpMessageInputStream in = get(armoredMessage, options);