aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2017-05-28 01:55:31 +0200
committerHarald Welte <laforge@gnumonks.org>2017-05-28 01:56:33 +0200
commit07d691314c3b61735a766ec3d455f8084fa05872 (patch)
tree0225ee4fa4f0f950317b0477d01b15a6dd165e81
parentf3d2ad6a19a4303e8e914f4efb1bef36ab2e6b79 (diff)
RTP: give meaningful error messages if something fails
In fact, it should probably be better to silently ignore all those errors as opposed to aborting the entire processing queue? But that's for another patch...
-rw-r--r--src/pq_rtp.c32
1 files changed, 24 insertions, 8 deletions
diff --git a/src/pq_rtp.c b/src/pq_rtp.c
index 6860506..1a7edde 100644
--- a/src/pq_rtp.c
+++ b/src/pq_rtp.c
@@ -98,36 +98,52 @@ pq_cb_rtp_input(void *_state, uint8_t *out, const uint8_t *in)
int rv, x_len, payload_len;
rv = read(state->fd, buf, sizeof(buf));
- if (rv <= 0)
+ if (rv <= 0) {
+ perror("RTP read");
return -1;
+ }
- if (rv < sizeof(struct rtp_hdr))
+ if (rv < sizeof(struct rtp_hdr)) {
+ fprintf(stderr, "%d smaller than rtp header\n", rv);
return -1;
+ }
- if (rtph->version != RTP_VERSION)
+ if (rtph->version != RTP_VERSION) {
+ fprintf(stderr, "unknown RTP version %u\n", rtph->version);
return -1;
+ }
payload = buf + sizeof(struct rtp_hdr) + (rtph->csrc_count << 2);
payload_len = rv - sizeof(struct rtp_hdr) - (rtph->csrc_count << 2);
- if (payload_len < 0)
+ if (payload_len < 0) {
+ fprintf(stderr, "non-existant RTP payload length %d\n", payload_len);
return -1;
+ }
if (rtph->extension) {
- if (payload_len < sizeof(struct rtp_x_hdr))
+ if (payload_len < sizeof(struct rtp_x_hdr)) {
+ fprintf(stderr, "short extension header: %d\n", payload_len);
return -1;
+ }
rtpxh = (struct rtp_x_hdr *)payload;
x_len = ntohs(rtpxh->length) * 4 + sizeof(struct rtp_x_hdr);
payload += x_len;
payload_len -= x_len;
- if (payload_len < 0)
+ if (payload_len < 0) {
+ fprintf(stderr, "short RTP payload length %d\n", payload_len);
return -1;
+ }
}
if (rtph->padding) {
- if (payload_len < 0)
+ if (payload_len < 0) {
+ fprintf(stderr, "padding but no payload length %d\n", payload_len);
return -1;
+ }
payload_len -= payload[payload_len -1];
- if (payload_len < 0)
+ if (payload_len < 0) {
+ fprintf(stderr, "no payload left after padding %d\n", payload_len);
return -1;
+ }
}
state->ssrc = ntohl(rtph->ssrc);