rtp: fix non null terminated string / non portable sscanf

In rtp.c:

if (sscanf(t+9, "%i %64c", &_payload, c) == 2)

the string c seems to be non-null terminated. It is later used as
following:

c[strcspn(c, "\n")] = 0;

The same piece of code is responsible for the inability of pulseaudio
on OpenWRT to handle RTP stream at the rate 48000 from another
machine:

[pulseaudio] sdp.c: Failed to parse SDP data: missing data.

It turns out that uClibc does not agree with glibc about "%64c", see
http://git.uclibc.org/uClibc/tree/docs/Glibc_vs_uClibc_Differences.txt

BugLink: https://bugs.freedesktop.org/show_bug.cgi?id=92568
This commit is contained in:
Lev Melnikovsky 2015-11-04 12:42:21 +02:00 committed by Tanu Kaskinen
parent 8fe9847706
commit 9d2b763e29

View file

@ -213,15 +213,16 @@ pa_sdp_info *pa_sdp_parse(const char *t, pa_sdp_info *i, int is_goodbye) {
if (i->payload <= 127) { if (i->payload <= 127) {
char c[64]; char c[64];
int _payload; int _payload;
int len;
if (sscanf(t+9, "%i %64c", &_payload, c) == 2) { if (sscanf(t + 9, "%i %n", &_payload, &len) == 1) {
if (_payload < 0 || _payload > 127) { if (_payload < 0 || _payload > 127) {
pa_log("Failed to parse SDP data: invalid payload %i.", _payload); pa_log("Failed to parse SDP data: invalid payload %i.", _payload);
goto fail; goto fail;
} }
if (_payload == i->payload) { if (_payload == i->payload) {
strncpy(c, t + 9 + len, 63);
c[63] = 0;
c[strcspn(c, "\n")] = 0; c[strcspn(c, "\n")] = 0;
if (parse_sdp_sample_spec(&i->sample_spec, c)) if (parse_sdp_sample_spec(&i->sample_spec, c))