Fix memory leaks when using PolarSSL. Valgrind says it's 100% leak free now :)
[umurmur.git] / src / messages.c
index 09ec927378c603f6ae3ca29a115afa985b186242..06a72eb4fae8c696fb1493594a9b0077b3835c0e 100644 (file)
 
 #define PREAMBLE_SIZE 6
 
-void dumpmsg(uint8_t *data, int size);
+static void dumpmsg(uint8_t *data, int size);
 static message_t *Msg_create_nopayload(messageType_t messageType);
 
-void Msg_addPreamble(uint8_t *buffer, uint16_t type, uint32_t len)
+static void Msg_addPreamble(uint8_t *buffer, uint16_t type, uint32_t len)
 {
        type = htons(type);
        len = htonl(len);
@@ -232,13 +232,13 @@ int Msg_messageToNetwork(message_t *msg, uint8_t *buffer)
                break;
 
        default:
-               Log_warn("Msg_networkToMessage: Unsupported message %d", msg->messageType);
+               Log_warn("Msg_MessageToNetwork: Unsupported message %d", msg->messageType);
                return 0;
        }
        return len + PREAMBLE_SIZE;
 }
 
-message_t *Msg_create_nopayload(messageType_t messageType)
+static message_t *Msg_create_nopayload(messageType_t messageType)
 {
        message_t *msg = malloc(sizeof(message_t));
 
@@ -436,8 +436,12 @@ void Msg_free(message_t *msg)
                if (msg->unpacked)
                        mumble_proto__channel_state__free_unpacked(msg->payload.channelState, NULL);
                else {
-                       free(msg->payload.channelState->name);
-                       free(msg->payload.channelState->description);
+                       if (msg->payload.channelState->name)
+                               free(msg->payload.channelState->name);
+                       if (msg->payload.channelState->description)
+                               free(msg->payload.channelState->description);
+                       if (msg->payload.channelState->links)
+                               free(msg->payload.channelState->links);
                        free(msg->payload.channelState);
                }
                break;
@@ -501,6 +505,23 @@ void dumpmsg(uint8_t *data, int size)
        } 
 }
 
+message_t *Msg_CreateVoiceMsg(uint8_t *data, int size)
+{
+       message_t *msg = NULL;
+       
+       msg = Msg_create_nopayload(UDPTunnel);
+       msg->unpacked = false;
+       msg->payload.UDPTunnel = malloc(sizeof(struct _MumbleProto__UDPTunnel));
+       if (msg->payload.UDPTunnel == NULL)
+               Log_fatal("Out of memory");
+       msg->payload.UDPTunnel->packet.data = malloc(size);
+       if (msg->payload.UDPTunnel->packet.data == NULL)
+               Log_fatal("Out of memory");
+       memcpy(msg->payload.UDPTunnel->packet.data, data, size);
+       msg->payload.UDPTunnel->packet.len = size;
+       return msg;
+}
+
 message_t *Msg_networkToMessage(uint8_t *data, int size)
 {
        message_t *msg = NULL;
@@ -524,16 +545,7 @@ message_t *Msg_networkToMessage(uint8_t *data, int size)
        }
        case UDPTunnel: /* Non-standard handling of tunneled voice data */
        {
-               msg = Msg_create_nopayload(UDPTunnel);
-               msg->unpacked = false;
-               msg->payload.UDPTunnel = malloc(sizeof(struct _MumbleProto__UDPTunnel));
-               if (msg->payload.UDPTunnel == NULL)
-                       Log_fatal("Out of memory");
-               msg->payload.UDPTunnel->packet.data = malloc(msgLen);
-               if (msg->payload.UDPTunnel->packet.data == NULL)
-                       Log_fatal("Out of memory");
-               memcpy(msg->payload.UDPTunnel->packet.data, msgData, msgLen);
-               msg->payload.UDPTunnel->packet.len = msgLen;
+               msg = Msg_CreateVoiceMsg(msgData, msgLen);
                break;
        }
        case Authenticate: