/** * Tries loading the message in the given message file * and verifies that DBusMessageLoader can handle it. * * @param filename filename to load * @param expected_validity what the message has to be like to return #TRUE * @returns #TRUE if the message has the expected validity */ dbus_bool_t dbus_internal_do_not_use_try_message_file (const DBusString *filename, DBusValidity expected_validity) { DBusString data; dbus_bool_t retval; retval = FALSE; if (!_dbus_string_init (&data)) _dbus_assert_not_reached ("could not allocate string\n"); if (!dbus_internal_do_not_use_load_message_file (filename, &data)) goto failed; retval = dbus_internal_do_not_use_try_message_data (&data, expected_validity); failed: if (!retval) { if (_dbus_string_get_length (&data) > 0) _dbus_verbose_bytes_of_string (&data, 0, _dbus_string_get_length (&data)); _dbus_warn ("Failed message loader test on %s\n", _dbus_string_get_const_data (filename)); } _dbus_string_free (&data); return retval; }
static dbus_bool_t find_breaks_based_on (const DBusString *filename, dbus_bool_t is_raw, DBusMessageValidity expected_validity, void *data) { DBusString orig_data; DBusString mutated; const char *filename_c; dbus_bool_t retval; int i; filename_c = _dbus_string_get_const_data (filename); retval = FALSE; if (!_dbus_string_init (&orig_data)) _dbus_assert_not_reached ("could not allocate string\n"); if (!_dbus_string_init (&mutated)) _dbus_assert_not_reached ("could not allocate string\n"); if (!dbus_internal_do_not_use_load_message_file (filename, is_raw, &orig_data)) { fprintf (stderr, "could not load file %s\n", filename_c); goto failed; } printf (" changing one random byte 100 times\n"); i = 0; while (i < 100) { randomly_change_one_byte (&orig_data, &mutated); try_mutated_data (&mutated); ++i; } printf (" changing length 50 times\n"); i = 0; while (i < 50) { randomly_modify_length (&orig_data, &mutated); try_mutated_data (&mutated); ++i; } printf (" removing one byte 50 times\n"); i = 0; while (i < 50) { randomly_remove_one_byte (&orig_data, &mutated); try_mutated_data (&mutated); ++i; } printf (" adding one byte 50 times\n"); i = 0; while (i < 50) { randomly_add_one_byte (&orig_data, &mutated); try_mutated_data (&mutated); ++i; } printf (" changing ints to boundary values 50 times\n"); i = 0; while (i < 50) { randomly_set_extreme_ints (&orig_data, &mutated); try_mutated_data (&mutated); ++i; } printf (" changing typecodes 50 times\n"); i = 0; while (i < 50) { randomly_change_one_type (&orig_data, &mutated); try_mutated_data (&mutated); ++i; } printf (" changing message length 15 times\n"); i = 0; while (i < 15) { randomly_shorten_or_lengthen (&orig_data, &mutated); try_mutated_data (&mutated); ++i; } printf (" randomly making 2 of above modifications 42 times\n"); i = 0; while (i < 42) { randomly_do_n_things (&orig_data, &mutated, 2); try_mutated_data (&mutated); ++i; } printf (" randomly making 3 of above modifications 42 times\n"); i = 0; while (i < 42) { randomly_do_n_things (&orig_data, &mutated, 3); try_mutated_data (&mutated); ++i; } printf (" randomly making 4 of above modifications 42 times\n"); i = 0; while (i < 42) { randomly_do_n_things (&orig_data, &mutated, 4); try_mutated_data (&mutated); ++i; } retval = TRUE; failed: _dbus_string_free (&orig_data); _dbus_string_free (&mutated); /* FALSE means end the whole process */ return retval; }