From efdd55fad5fdbde27cdafb968b58b8b1f905b813 Mon Sep 17 00:00:00 2001 From: claincly Date: Fri, 4 Jun 2021 18:50:11 +0100 Subject: [PATCH] Propagate duplicated keys error in SDP better. The current code does not catch the IAE thrown when building a MediaDescription or SessionDescription. This CL catches the IAE and propagates it as a ParserException. Issue: #9014. #minor-release PiperOrigin-RevId: 377544439 --- .../source/rtsp/SessionDescriptionParser.java | 4 +-- .../source/rtsp/SessionDescriptionTest.java | 30 +++++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/SessionDescriptionParser.java b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/SessionDescriptionParser.java index 8b91cae609..6d37b12c89 100644 --- a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/SessionDescriptionParser.java +++ b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/SessionDescriptionParser.java @@ -189,7 +189,7 @@ import java.util.regex.Pattern; try { return sessionDescriptionBuilder.build(); - } catch (IllegalStateException e) { + } catch (IllegalArgumentException | IllegalStateException e) { throw ParserException.createForMalformedManifest(/* message= */ null, e); } } @@ -200,7 +200,7 @@ import java.util.regex.Pattern; throws ParserException { try { sessionDescriptionBuilder.addMediaDescription(mediaDescriptionBuilder.build()); - } catch (IllegalStateException e) { + } catch (IllegalArgumentException | IllegalStateException e) { throw ParserException.createForMalformedManifest(/* message= */ null, e); } } diff --git a/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/SessionDescriptionTest.java b/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/SessionDescriptionTest.java index 1a686e08d9..d8f0a062ca 100644 --- a/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/SessionDescriptionTest.java +++ b/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/SessionDescriptionTest.java @@ -30,6 +30,7 @@ import static org.junit.Assert.assertThrows; import android.net.Uri; import androidx.test.ext.junit.runners.AndroidJUnit4; +import com.google.android.exoplayer2.ParserException; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.annotation.internal.DoNotInstrument; @@ -151,6 +152,35 @@ public class SessionDescriptionTest { assertThat(sessionDescription).isEqualTo(expectedSession); } + @Test + public void parse_sdpStringWithDuplicatedMediaAttribute_throwsParserException() { + String testMediaSdpInfo = + "v=0\r\n" + + "o=MNobody 2890844526 2890842807 IN IP4 192.0.2.46\r\n" + + "s=SDP Seminar\r\n" + + "i=A Seminar on the session description protocol\r\n" + + "m=audio 3456 RTP/AVP 0\r\n" + + "a=control:audio\r\n" + + "a=control:audio\r\n"; + + assertThrows(ParserException.class, () -> SessionDescriptionParser.parse(testMediaSdpInfo)); + } + + @Test + public void parse_sdpStringWithDuplicatedSessionAttribute_throwsParserException() { + String testMediaSdpInfo = + "v=0\r\n" + + "o=MNobody 2890844526 2890842807 IN IP4 192.0.2.46\r\n" + + "s=SDP Seminar\r\n" + + "a=control:*\r\n" + + "a=control:*\r\n" + + "i=A Seminar on the session description protocol\r\n" + + "m=audio 3456 RTP/AVP 0\r\n" + + "a=control:audio\r\n"; + + assertThrows(ParserException.class, () -> SessionDescriptionParser.parse(testMediaSdpInfo)); + } + @Test public void buildMediaDescription_withInvalidRtpmapAttribute_throwsIllegalStateException() { assertThrows(