X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;f=src%2Fmessages.c;h=5931edd9e77d71044f3837f0975f80cc47f487dd;hb=f1a666fa49ec318684c76148912a734a01e194a7;hp=e40ae8f3b119f1dbadf88d7dc2122f818361fcd9;hpb=ccdcbaf61751aa59a4afb6828c513bedf11dcd37;p=umurmur.git diff --git a/src/messages.c b/src/messages.c index e40ae8f..5931edd 100644 --- a/src/messages.c +++ b/src/messages.c @@ -41,21 +41,17 @@ #define PREAMBLE_SIZE 6 -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) -{ - type = htons(type); - len = htonl(len); - - buffer[0] = (type) & 0xff; - buffer[1] = (type >> 8) & 0xff; +static void Msg_addPreamble(uint8_t *buffer, uint16_t type, uint32_t len) +{ + buffer[1] = (type) & 0xff; + buffer[0] = (type >> 8) & 0xff; - buffer[2] = (len) & 0xff; - buffer[3] = (len >> 8) & 0xff; - buffer[4] = (len >> 16) & 0xff; - buffer[5] = (len >> 24) & 0xff; + buffer[5] = (len) & 0xff; + buffer[4] = (len >> 8) & 0xff; + buffer[3] = (len >> 16) & 0xff; + buffer[2] = (len >> 24) & 0xff; } static void Msg_getPreamble(uint8_t *buffer, int *type, int *len) @@ -63,10 +59,10 @@ static void Msg_getPreamble(uint8_t *buffer, int *type, int *len) uint16_t msgType; uint32_t msgLen; - msgType = buffer[0] | (buffer[1] << 8); - msgLen = buffer[2] | (buffer[3] << 8) | (buffer[4] << 16) | (buffer[5] << 24); - *type = (int)ntohs(msgType); - *len = (int)ntohl(msgLen); + msgType = buffer[1] | (buffer[0] << 8); + msgLen = buffer[5] | (buffer[4] << 8) | (buffer[3] << 16) | (buffer[2] << 24); + *type = (int)msgType; + *len = (int)msgLen; } #define MAX_MSGSIZE (BUFSIZE - PREAMBLE_SIZE) @@ -232,13 +228,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 +432,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; @@ -484,21 +484,21 @@ void Msg_free(message_t *msg) free(msg); } -void dumpmsg(uint8_t *data, int size) +message_t *Msg_CreateVoiceMsg(uint8_t *data, int size) { - int i, r = 0, offset = 0; - char buf[512]; + message_t *msg = NULL; - while (r * 8 + i < size) { - for (i = 0; i < 8 && r * 8 + i < size; i++) { - offset += sprintf(buf + offset, "%x ", data[r * 8 + i]); - } - sprintf(buf + offset, "\n"); - printf(buf); - offset = 0; - r++; - i = 0; - } + 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) @@ -518,20 +518,13 @@ message_t *Msg_networkToMessage(uint8_t *data, int size) msg = Msg_create_nopayload(Version); msg->unpacked = true; msg->payload.version = mumble_proto__version__unpack(NULL, msgLen, msgData); + if (msg->payload.version == NULL) + goto err_out; break; } 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: @@ -539,6 +532,8 @@ message_t *Msg_networkToMessage(uint8_t *data, int size) msg = Msg_create_nopayload(Authenticate); msg->unpacked = true; msg->payload.authenticate = mumble_proto__authenticate__unpack(NULL, msgLen, msgData); + if (msg->payload.authenticate == NULL) + goto err_out; break; } case Ping: @@ -546,6 +541,8 @@ message_t *Msg_networkToMessage(uint8_t *data, int size) msg = Msg_create_nopayload(Ping); msg->unpacked = true; msg->payload.ping = mumble_proto__ping__unpack(NULL, msgLen, msgData); + if (msg->payload.ping == NULL) + goto err_out; break; } case Reject: @@ -553,6 +550,8 @@ message_t *Msg_networkToMessage(uint8_t *data, int size) msg = Msg_create_nopayload(Reject); msg->unpacked = true; msg->payload.reject = mumble_proto__reject__unpack(NULL, msgLen, msgData); + if (msg->payload.reject == NULL) + goto err_out; break; } case ServerSync: @@ -560,6 +559,8 @@ message_t *Msg_networkToMessage(uint8_t *data, int size) msg = Msg_create_nopayload(ServerSync); msg->unpacked = true; msg->payload.serverSync = mumble_proto__server_sync__unpack(NULL, msgLen, msgData); + if (msg->payload.serverSync == NULL) + goto err_out; break; } case TextMessage: @@ -567,6 +568,8 @@ message_t *Msg_networkToMessage(uint8_t *data, int size) msg = Msg_create_nopayload(TextMessage); msg->unpacked = true; msg->payload.textMessage = mumble_proto__text_message__unpack(NULL, msgLen, msgData); + if (msg->payload.textMessage == NULL) + goto err_out; break; } case PermissionDenied: @@ -574,6 +577,8 @@ message_t *Msg_networkToMessage(uint8_t *data, int size) msg = Msg_create_nopayload(PermissionDenied); msg->unpacked = true; msg->payload.permissionDenied = mumble_proto__permission_denied__unpack(NULL, msgLen, msgData); + if (msg->payload.permissionDenied == NULL) + goto err_out; break; } case CryptSetup: @@ -581,6 +586,8 @@ message_t *Msg_networkToMessage(uint8_t *data, int size) msg = Msg_create_nopayload(CryptSetup); msg->unpacked = true; msg->payload.cryptSetup = mumble_proto__crypt_setup__unpack(NULL, msgLen, msgData); + if (msg->payload.cryptSetup == NULL) + goto err_out; break; } case UserList: @@ -588,6 +595,8 @@ message_t *Msg_networkToMessage(uint8_t *data, int size) msg = Msg_create_nopayload(UserList); msg->unpacked = true; msg->payload.userList = mumble_proto__user_list__unpack(NULL, msgLen, msgData); + if (msg->payload.userList == NULL) + goto err_out; break; } case UserState: @@ -595,6 +604,8 @@ message_t *Msg_networkToMessage(uint8_t *data, int size) msg = Msg_create_nopayload(UserState); msg->unpacked = true; msg->payload.userState = mumble_proto__user_state__unpack(NULL, msgLen, msgData); + if (msg->payload.userState == NULL) + goto err_out; break; } case ChannelState: @@ -602,6 +613,8 @@ message_t *Msg_networkToMessage(uint8_t *data, int size) msg = Msg_create_nopayload(ChannelState); msg->unpacked = true; msg->payload.channelState = mumble_proto__channel_state__unpack(NULL, msgLen, msgData); + if (msg->payload.channelState == NULL) + goto err_out; break; } case VoiceTarget: @@ -609,6 +622,8 @@ message_t *Msg_networkToMessage(uint8_t *data, int size) msg = Msg_create_nopayload(VoiceTarget); msg->unpacked = true; msg->payload.voiceTarget = mumble_proto__voice_target__unpack(NULL, msgLen, msgData); + if (msg->payload.voiceTarget == NULL) + goto err_out; break; } case CodecVersion: @@ -616,6 +631,8 @@ message_t *Msg_networkToMessage(uint8_t *data, int size) msg = Msg_create_nopayload(CodecVersion); msg->unpacked = true; msg->payload.codecVersion = mumble_proto__codec_version__unpack(NULL, msgLen, msgData); + if (msg->payload.codecVersion == NULL) + goto err_out; break; } case PermissionQuery: @@ -623,6 +640,8 @@ message_t *Msg_networkToMessage(uint8_t *data, int size) msg = Msg_create_nopayload(PermissionQuery); msg->unpacked = true; msg->payload.permissionQuery = mumble_proto__permission_query__unpack(NULL, msgLen, msgData); + if (msg->payload.permissionQuery == NULL) + goto err_out; break; } case ChannelRemove: @@ -630,6 +649,8 @@ message_t *Msg_networkToMessage(uint8_t *data, int size) msg = Msg_create_nopayload(ChannelRemove); msg->unpacked = true; msg->payload.channelRemove = mumble_proto__channel_remove__unpack(NULL, msgLen, msgData); + if (msg->payload.channelRemove == NULL) + goto err_out; break; } @@ -638,4 +659,8 @@ message_t *Msg_networkToMessage(uint8_t *data, int size) break; } return msg; + +err_out: + free(msg); + return NULL; }