/*
Copyright (C) 2015 Red Hat, Inc.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, see .
*/
#ifdef HAVE_CONFIG_H
#include
#endif
#include
#include
#include
#include
#include
#include
#include
#include
#define NUM_CHANNELS 3u
int main(void)
{
SpiceMarshaller *m;
SpiceMsgChannels *msg;
uint8_t *data, *out;
size_t len;
int to_free = 0;
spice_parse_channel_func_t func;
unsigned int max_message_type, n;
message_destructor_t free_output;
m = spice_marshaller_new();
assert(m);
msg = (SpiceMsgChannels *) malloc(sizeof(SpiceMsgChannels) +
NUM_CHANNELS * sizeof(SpiceChannelId));
assert(msg);
// build a message and marshal it
msg->num_of_channels = NUM_CHANNELS;
for (n = 0; n < NUM_CHANNELS; ++n) {
msg->channels[n] = (SpiceChannelId) { n + 1, n * 7 };
}
spice_marshall_msg_main_channels_list(m, msg);
// get linear data
data = spice_marshaller_linearize(m, 0, &len, &to_free);
assert(data);
printf("output len %lu\n", (unsigned long) len);
// hack: setting the number of channels in the marshalled message to a
// value that will cause overflow while parsing the message to make sure
// that the parser can handle this situation
*((uint32_t *) data) = 0x80000002u;
// extract the message
func = spice_get_server_channel_parser(SPICE_CHANNEL_MAIN, &max_message_type);
assert(func);
out = func(data, data+len, SPICE_MSG_MAIN_CHANNELS_LIST, 0, &len, &free_output);
assert(out == NULL);
// cleanup
if (to_free) {
free(data);
}
if (out) {
free_output(out);
}
free(msg);
spice_marshaller_destroy(m);
return 0;
}