summaryrefslogtreecommitdiff
path: root/src/cmumble.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmumble.c')
-rw-r--r--src/cmumble.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/src/cmumble.c b/src/cmumble.c
index cafef90..1d10d97 100644
--- a/src/cmumble.c
+++ b/src/cmumble.c
@@ -13,12 +13,15 @@ static void
recv_udp_tunnel(MumbleProto__UDPTunnel *tunnel, struct cmumble *cm)
{
int64_t session, sequence;
- uint32_t pos = 1, read = 0;
+ uint32_t pos = 0, read = 0;
uint8_t frame_len, terminator;
struct cmumble_user *user = NULL;
uint8_t *data = tunnel->packet.data;
size_t len = tunnel->packet.len;
+ uint8_t type;
+ type = data[pos] >> 5;
+ pos += 1;
session = decode_varint(&data[pos], &read, len-pos);
pos += read;
sequence = decode_varint(&data[pos], &read, len-pos);
@@ -26,11 +29,17 @@ recv_udp_tunnel(MumbleProto__UDPTunnel *tunnel, struct cmumble *cm)
user = find_user(cm, session);
if (user == NULL) {
- g_printerr("received audio packet from unknown user, "
+ g_printerr("Received audio packet from unknown user, "
"dropping.\n");
return;
}
+ if (type != udp_voice_celt_alpha) {
+ g_printerr("Retrieved unimplemented codec %d from: %s\n",
+ type, user->name);
+ return;
+ }
+
do {
frame_len = data[pos] & 0x7F;
terminator = data[pos] & 0x80;
@@ -39,6 +48,9 @@ recv_udp_tunnel(MumbleProto__UDPTunnel *tunnel, struct cmumble *cm)
if (frame_len == 0 || frame_len > len-pos)
break;
+ if (frame_len < 2)
+ break;
+
cmumble_audio_push(cm, user, &data[pos], frame_len);
pos += frame_len;