UDPTunnel message tx handling didn't set len parameter. Fixed.
[umurmur.git] / src / messages.c
index b290257c1e4d24c35580761f63343e34b1a5800d..e40ae8f3b119f1dbadf88d7dc2122f818361fcd9 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2010, Martin Johansson <martin@fatbob.nu>
+/* Copyright (C) 2009-2010, Martin Johansson <martin@fatbob.nu>
    Copyright (C) 2005-2010, Thorvald Natvig <thorvald@natvig.com>
 
    All rights reserved.
@@ -39,6 +39,7 @@
 #include "pds.h"
 #include "log.h"
 
+#define PREAMBLE_SIZE 6
 
 void dumpmsg(uint8_t *data, int size);
 static message_t *Msg_create_nopayload(messageType_t messageType);
@@ -68,11 +69,11 @@ static void Msg_getPreamble(uint8_t *buffer, int *type, int *len)
        *len = (int)ntohl(msgLen);
 }
 
-#define MAX_MSGSIZE (BUFSIZE - 6)
+#define MAX_MSGSIZE (BUFSIZE - PREAMBLE_SIZE)
 int Msg_messageToNetwork(message_t *msg, uint8_t *buffer)
 {
        int len;
-       uint8_t *bufptr = buffer + 6;
+       uint8_t *bufptr = buffer + PREAMBLE_SIZE;
                
        Log_debug("To net: msg type %d", msg->messageType);
        switch (msg->messageType) {
@@ -83,8 +84,6 @@ int Msg_messageToNetwork(message_t *msg, uint8_t *buffer)
                        break;
                }
                Msg_addPreamble(buffer, msg->messageType, len);
-               Log_debug("To net: Version->release: %s Version->os: %s",
-                                 msg->payload.version->release, msg->payload.version->os);
                mumble_proto__version__pack(msg->payload.version, bufptr);
                break;
        case UDPTunnel: /* Non-standard handling of tunneled voice traffic. */
@@ -92,6 +91,7 @@ int Msg_messageToNetwork(message_t *msg, uint8_t *buffer)
                        Log_warn("Too big tx message. Discarding");
                        break;
                }
+               len = msg->payload.UDPTunnel->packet.len;
                Msg_addPreamble(buffer, msg->messageType, msg->payload.UDPTunnel->packet.len);
                memcpy(bufptr, msg->payload.UDPTunnel->packet.data, msg->payload.UDPTunnel->packet.len);
                break;
@@ -176,6 +176,15 @@ int Msg_messageToNetwork(message_t *msg, uint8_t *buffer)
                Msg_addPreamble(buffer, msg->messageType, len);
                mumble_proto__user_state__pack(msg->payload.userState, bufptr);
                break;
+       case UserRemove:
+               len = mumble_proto__user_remove__get_packed_size(msg->payload.userRemove);
+               if (len > MAX_MSGSIZE) {
+                       Log_warn("Too big tx message. Discarding");
+                       break;
+                       }
+               Msg_addPreamble(buffer, msg->messageType, len);
+               mumble_proto__user_remove__pack(msg->payload.userRemove, bufptr);
+               break;
        case ChannelState:
                len = mumble_proto__channel_state__get_packed_size(msg->payload.channelState);
                if (len > MAX_MSGSIZE) {
@@ -212,12 +221,21 @@ int Msg_messageToNetwork(message_t *msg, uint8_t *buffer)
                Msg_addPreamble(buffer, msg->messageType, len);
                mumble_proto__permission_query__pack(msg->payload.permissionQuery, bufptr);
                break;
+       case ChannelRemove:
+               len = mumble_proto__channel_remove__get_packed_size(msg->payload.channelRemove);
+               if (len > MAX_MSGSIZE) {
+                       Log_warn("Too big tx message. Discarding");
+                       break;
+                       }
+               Msg_addPreamble(buffer, msg->messageType, len);
+               mumble_proto__channel_remove__pack(msg->payload.channelRemove, bufptr);
+               break;
 
        default:
-               Log_warn("Unsupported message %d", msg->messageType);
+               Log_warn("Msg_networkToMessage: Unsupported message %d", msg->messageType);
                return 0;
        }
-       return len + 6;
+       return len + PREAMBLE_SIZE;
 }
 
 message_t *Msg_create_nopayload(messageType_t messageType)
@@ -282,6 +300,10 @@ message_t *Msg_create(messageType_t messageType)
                msg->payload.userState = malloc(sizeof(MumbleProto__UserState));
                mumble_proto__user_state__init(msg->payload.userState);
                break;
+       case ChannelState:
+               msg->payload.channelState = malloc(sizeof(MumbleProto__ChannelState));
+               mumble_proto__channel_state__init(msg->payload.channelState);
+               break;
        case UserRemove:
                msg->payload.userRemove = malloc(sizeof(MumbleProto__UserRemove));
                mumble_proto__user_remove__init(msg->payload.userRemove);
@@ -294,14 +316,14 @@ message_t *Msg_create(messageType_t messageType)
                msg->payload.codecVersion = malloc(sizeof(MumbleProto__CodecVersion));
                mumble_proto__codec_version__init(msg->payload.codecVersion);
                break;
-       case ChannelState:
-               msg->payload.channelState = malloc(sizeof(MumbleProto__ChannelState));
-               mumble_proto__channel_state__init(msg->payload.channelState);
-               break;
        case PermissionQuery:
                msg->payload.permissionQuery = malloc(sizeof(MumbleProto__PermissionQuery));
                mumble_proto__permission_query__init(msg->payload.permissionQuery);
                break;
+       case ChannelRemove:
+               msg->payload.channelRemove = malloc(sizeof(MumbleProto__ChannelRemove));
+               mumble_proto__channel_remove__init(msg->payload.channelRemove);
+               break;
 
        default:
                Log_warn("Msg_create: Unsupported message %d", msg->messageType);
@@ -410,6 +432,15 @@ void Msg_free(message_t *msg)
                        free(msg->payload.userState);
                }
                break;
+       case ChannelState:
+               if (msg->unpacked)
+                       mumble_proto__channel_state__free_unpacked(msg->payload.channelState, NULL);
+               else {
+                       free(msg->payload.channelState->name);
+                       free(msg->payload.channelState->description);
+                       free(msg->payload.channelState);
+               }
+               break;
        case UserRemove:
                if (msg->unpacked)
                        mumble_proto__user_remove__free_unpacked(msg->payload.userRemove, NULL);
@@ -431,21 +462,18 @@ void Msg_free(message_t *msg)
                        free(msg->payload.codecVersion);
                }
                break;
-       case ChannelState:
+       case PermissionQuery:
                if (msg->unpacked)
-                       mumble_proto__channel_state__free_unpacked(msg->payload.channelState, NULL);
+                       mumble_proto__permission_query__free_unpacked(msg->payload.permissionQuery, NULL);
                else {
-                       if (msg->payload.channelState->description)
-                               free(msg->payload.channelState->description);
-                       free(msg->payload.channelState->name);
-                       free(msg->payload.channelState);
+                       free(msg->payload.permissionQuery);
                }
                break;
-       case PermissionQuery:
+       case ChannelRemove:
                if (msg->unpacked)
-                       mumble_proto__permission_query__free_unpacked(msg->payload.permissionQuery, NULL);
+                       mumble_proto__channel_remove__free_unpacked(msg->payload.channelRemove, NULL);
                else {
-                       free(msg->payload.permissionQuery);
+                       free(msg->payload.channelRemove);
                }
                break;
 
@@ -569,6 +597,13 @@ message_t *Msg_networkToMessage(uint8_t *data, int size)
                msg->payload.userState = mumble_proto__user_state__unpack(NULL, msgLen, msgData);
                break;
        }
+       case ChannelState:
+       {
+               msg = Msg_create_nopayload(ChannelState);
+               msg->unpacked = true;
+               msg->payload.channelState = mumble_proto__channel_state__unpack(NULL, msgLen, msgData);
+               break;
+       }
        case VoiceTarget:
        {
                msg = Msg_create_nopayload(VoiceTarget);
@@ -590,6 +625,13 @@ message_t *Msg_networkToMessage(uint8_t *data, int size)
                msg->payload.permissionQuery = mumble_proto__permission_query__unpack(NULL, msgLen, msgData);
                break;
        }
+       case ChannelRemove:
+       {
+               msg = Msg_create_nopayload(ChannelRemove);
+               msg->unpacked = true;
+               msg->payload.channelRemove = mumble_proto__channel_remove__unpack(NULL, msgLen, msgData);
+               break;
+       }
 
        default:
                Log_warn("Unsupported message %d", messageType);