[pulseaudio-discuss,1/3] rtp: Support CR/LF separators in SDP packets

Submitted by Cédric Schieli on May 9, 2016, 9:33 a.m.

Details

Message ID 1462786434-18477-2-git-send-email-cschieli@gmail.com
State New
Headers show
Series "rtp-recv: interoperability fixes" ( rev: 1 ) in PulseAudio

Not browsing as part of any series.

Commit Message

Cédric Schieli May 9, 2016, 9:33 a.m.
According to RFC 4566 section 5: The sequence CRLF (0x0d0a) is used to
end a record, although parsers SHOULD be tolerant and also accept records
terminated with a single newline character.

Right now, only LF-separated records are understood, so it's clearly a
bug. This has already been spotted here[1] and here[2] but never properly
fixed.

Let's fix the parser to accept both. The writer should also be fixed to
always send CR/LF, but this would trigger backward compatibility issues
with existing PA installations.

[1] https://lists.freedesktop.org/archives/pulseaudio-discuss/2012-July/014183.html
[2] https://lists.freedesktop.org/archives/pulseaudio-discuss/2013-December/019626.html

Signed-off-by: Cédric Schieli <cschieli@gmail.com>
---
 src/modules/rtp/sdp.c | 13 ++++++++++++-
 src/modules/rtp/sdp.h |  2 +-
 2 files changed, 13 insertions(+), 2 deletions(-)

Patch hide | download patch | download mbox

diff --git a/src/modules/rtp/sdp.c b/src/modules/rtp/sdp.c
index 14953cf..c928c2f 100644
--- a/src/modules/rtp/sdp.c
+++ b/src/modules/rtp/sdp.c
@@ -64,7 +64,7 @@  char *pa_sdp_build(int af, const void *src, const void *dst, const char *name, u
     pa_assert_se(inet_ntop(af, dst, buf_dst, sizeof(buf_dst)));
 
     return pa_sprintf_malloc(
-            PA_SDP_HEADER
+            PA_SDP_HEADER "\n"
             "o=%s %lu 0 IN %s %s\n"
             "s=%s\n"
             "c=IN %s %s\n"
@@ -133,11 +133,20 @@  pa_sdp_info *pa_sdp_parse(const char *t, pa_sdp_info *i, int is_goodbye) {
     }
 
     t += sizeof(PA_SDP_HEADER)-1;
+    if (*t == '\r')
+        t++;
+    if (*t != '\n') {
+        pa_log("Failed to parse SDP data: invalid header.");
+        goto fail;
+    }
+    t++;
 
     while (*t) {
         size_t l;
 
         l = strcspn(t, "\n");
+	if (t[l-1] == '\r')
+	    l--;
 
         if (l <= 2) {
             pa_log("Failed to parse SDP data: line too short: >%s<.", t);
@@ -234,6 +243,8 @@  pa_sdp_info *pa_sdp_parse(const char *t, pa_sdp_info *i, int is_goodbye) {
 
         t += l;
 
+        if (*t == '\r')
+            t++;
         if (*t == '\n')
             t++;
     }
diff --git a/src/modules/rtp/sdp.h b/src/modules/rtp/sdp.h
index 5e9b8fe..46c559a 100644
--- a/src/modules/rtp/sdp.h
+++ b/src/modules/rtp/sdp.h
@@ -26,7 +26,7 @@ 
 
 #include <pulse/sample.h>
 
-#define PA_SDP_HEADER "v=0\n"
+#define PA_SDP_HEADER "v=0"
 
 typedef struct pa_sdp_info {
     char *origin;