test-overflow was doing a specific test on demarshalling code. Joining the 2 tests also allows to remove the dependency from the main protocol allowing to run the test independently from generation setting. Using Meson when building either SPICE server or spice-gtk, we only generate the specific marshallers/demarshallers for that given case. With this commit the test is generate in any case. Signed-off-by: Frediano Ziglio <fziglio@xxxxxxxxxx> --- tests/Makefile.am | 17 ++----- tests/meson.build | 6 +-- tests/test-marshallers.c | 81 +++++++++++++++++++++++++++++++-- tests/test-marshallers.h | 5 +++ tests/test-marshallers.proto | 5 +++ tests/test-overflow.c | 87 ------------------------------------ 6 files changed, 92 insertions(+), 109 deletions(-) delete mode 100644 tests/test-overflow.c Changes since v1: - update commit message diff --git a/tests/Makefile.am b/tests/Makefile.am index 1021954..926ac99 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -70,6 +70,7 @@ TEST_MARSHALLERS = \ generated_test_marshallers.c \ generated_test_marshallers.h \ generated_test_demarshallers.c \ + generated_test_enums.h \ $(NULL) BUILT_SOURCES = $(TEST_MARSHALLERS) @@ -92,6 +93,8 @@ generated_test_marshallers.h: $(srcdir)/test-marshallers.proto $(MARSHALLERS_DEP $(AM_V_GEN)$(PYTHON) $(top_srcdir)/spice_codegen.py --generate-marshallers --server --include test-marshallers.h -H $< $@ >/dev/null generated_test_demarshallers.c: $(srcdir)/test-marshallers.proto $(MARSHALLERS_DEPS) $(AM_V_GEN)$(PYTHON) $(top_srcdir)/spice_codegen.py --generate-demarshallers --client --include test-marshallers.h $< $@ >/dev/null +generated_test_enums.h: $(srcdir)/test-marshallers.proto $(MARSHALLERS_DEPS) + $(AM_V_GEN)$(PYTHON) $(top_srcdir)/spice_codegen.py -e $< $@ >/dev/null EXTRA_DIST = \ $(TEST_MARSHALLERS) \ @@ -99,18 +102,4 @@ EXTRA_DIST = \ test-marshallers.proto \ $(NULL) -TESTS += test_overflow -test_overflow_SOURCES = test-overflow.c -test_overflow_CFLAGS = \ - -I$(top_srcdir) \ - $(GLIB2_CFLAGS) \ - $(SPICE_COMMON_CFLAGS) \ - $(PROTOCOL_CFLAGS) \ - $(NULL) -test_overflow_LDADD = \ - $(top_builddir)/common/libspice-common.la \ - $(top_builddir)/common/libspice-common-server.la \ - $(top_builddir)/common/libspice-common-client.la \ - $(NULL) - -include $(top_srcdir)/git.mk diff --git a/tests/meson.build b/tests/meson.build index 94c72c6..e53fd64 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -4,11 +4,6 @@ tests = ['test-logging', 'test-region'] tests_deps = [spice_common_dep] -if spice_common_generate_code == 'all' - tests += ['test-overflow'] - tests_deps += [spice_common_client_dep, spice_common_server_dep] -endif - foreach t : tests name = t.underscorify() exe = executable(name, '@0@.c'.format(t), @@ -28,6 +23,7 @@ targets = [ ['test_marshallers', test_proto, 'generated_test_marshallers.c', ['--generate-marshallers', '--server', '--include', 'test-marshallers.h', '@INPUT@', '@OUTPUT@']], ['test_marshallers_h', test_proto, 'generated_test_marshallers.h', ['--generate-marshallers', '--server', '--include', 'test-marshallers.h', '-H', '@INPUT@', '@OUTPUT@']], ['test_demarshallers', test_proto, 'generated_test_demarshallers.c', ['--generate-demarshallers', '--client', '--include', 'test-marshallers.h', '@INPUT@', '@OUTPUT@']], + ['test_enums_h', test_proto, 'generated_test_enums.h', ['-e', '@INPUT@', '@OUTPUT@']], ] foreach t : targets diff --git a/tests/test-marshallers.c b/tests/test-marshallers.c index 3bd98e8..ad45e36 100644 --- a/tests/test-marshallers.c +++ b/tests/test-marshallers.c @@ -1,13 +1,85 @@ +/* + Copyright (C) 2015-2018 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 <http://www.gnu.org/licenses/>. +*/ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + #include <glib.h> #include <string.h> -#include "common/marshaller.h" +#include <common/marshaller.h> +#include <common/client_demarshallers.h> +#include "generated_test_enums.h" #include "generated_test_marshallers.h" #ifndef g_assert_true #define g_assert_true g_assert #endif +#define NUM_CHANNELS 3u + +void test_overflow(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; + + msg = (SpiceMsgChannels *) malloc(sizeof(SpiceMsgChannels) + + NUM_CHANNELS * sizeof(uint16_t)); + g_assert_nonnull(msg); + + // build a message and marshal it + msg->num_of_channels = NUM_CHANNELS; + for (n = 0; n < NUM_CHANNELS; ++n) { + msg->channels[n] = n + 1; + } + spice_marshall_msg_main_channels_list(m, msg); + + // get linear data + data = spice_marshaller_linearize(m, 0, &len, &to_free); + g_assert_nonnull(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); + g_assert_nonnull(func); + out = func(data, data+len, SPICE_MSG_MAIN_CHANNELS_LIST, 0, &len, &free_output); + g_assert_null(out); + + // cleanup + if (to_free) { + free(data); + } + if (out) { + free_output(out); + } + free(msg); +} + static uint8_t expected_data[] = { 123, /* dummy byte */ 0x02, 0x00, 0x00, 0x00, /* data_size */ 0x09, 0x00, 0x00, 0x00, /* data offset */ @@ -47,8 +119,9 @@ int main(int argc G_GNUC_UNUSED, char **argv G_GNUC_UNUSED) g_free(msg); // test demarshaller - msg = (SpiceMsgMainShortDataSubMarshall *) spice_parse_msg(data, data + len, 1, 1, 0, - &msg_len, &free_message); + msg = (SpiceMsgMainShortDataSubMarshall *) + spice_parse_msg(data, data + len, SPICE_CHANNEL_MAIN, SPICE_MSG_MAIN_SHORTDATASUBMARSHALL, + 0, &msg_len, &free_message); g_assert_nonnull(msg); g_assert_cmpint(msg->dummy_byte, ==, 123); @@ -75,6 +148,8 @@ int main(int argc G_GNUC_UNUSED, char **argv G_GNUC_UNUSED) free(data); } + test_overflow(marshaller); + spice_marshaller_destroy(marshaller); return 0; diff --git a/tests/test-marshallers.h b/tests/test-marshallers.h index 46263d7..99877c0 100644 --- a/tests/test-marshallers.h +++ b/tests/test-marshallers.h @@ -16,5 +16,10 @@ typedef struct { uint16_t n; } SpiceMsgMainZeroes; +typedef struct SpiceMsgChannels { + uint32_t num_of_channels; + uint16_t channels[0]; +} SpiceMsgChannels; + #endif /* _H_TEST_MARSHALLERS */ diff --git a/tests/test-marshallers.proto b/tests/test-marshallers.proto index 08d3e01..c75134e 100644 --- a/tests/test-marshallers.proto +++ b/tests/test-marshallers.proto @@ -14,6 +14,11 @@ channel TestChannel { uint16 n; uint32 res2 @zero; } Zeroes; + + message { + uint32 num_of_channels; + uint16 channels[num_of_channels] @end; + } @ctype(SpiceMsgChannels) channels_list; }; protocol Spice { diff --git a/tests/test-overflow.c b/tests/test-overflow.c deleted file mode 100644 index c972a25..0000000 --- a/tests/test-overflow.c +++ /dev/null @@ -1,87 +0,0 @@ -/* - 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 <http://www.gnu.org/licenses/>. -*/ -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <assert.h> - -#include <spice/enums.h> -#include <common/marshaller.h> -#include <common/generated_server_marshallers.h> -#include <common/client_demarshallers.h> - -#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; -} - -- 2.17.1 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel