qemu with hax to log dma reads & writes jcs.org/2018/11/12/vfio

qapi: Assert output visitors see only valid enum values

output_type_enum() fails when *obj is not a valid value of the enum
type. Should not happen. Drop the check, along with its unit tests.
This unmasks qapi_enum_lookup()'s assertion.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Message-Id: <20200424084338.26803-9-armbru@redhat.com>
[Commit message tweaked]

-67
-9
qapi/qapi-visit-core.c
··· 341 341 int value = *obj; 342 342 char *enum_str; 343 343 344 - /* 345 - * TODO why is this an error, not an assertion? If assertion: 346 - * delete, and rely on qapi_enum_lookup() 347 - */ 348 - if (value < 0 || value >= lookup->size) { 349 - error_setg(errp, QERR_INVALID_PARAMETER, name ? name : "null"); 350 - return; 351 - } 352 - 353 344 enum_str = (char *)qapi_enum_lookup(lookup, value); 354 345 visit_type_str(v, name, &enum_str, errp); 355 346 }
-39
tests/test-qobject-output-visitor.c
··· 141 141 } 142 142 } 143 143 144 - static void test_visitor_out_enum_errors(TestOutputVisitorData *data, 145 - const void *unused) 146 - { 147 - EnumOne i, bad_values[] = { ENUM_ONE__MAX, -1 }; 148 - 149 - for (i = 0; i < ARRAY_SIZE(bad_values) ; i++) { 150 - Error *err = NULL; 151 - 152 - visit_type_EnumOne(data->ov, "unused", &bad_values[i], &err); 153 - error_free_or_abort(&err); 154 - visitor_reset(data); 155 - } 156 - } 157 - 158 - 159 144 static void test_visitor_out_struct(TestOutputVisitorData *data, 160 145 const void *unused) 161 146 { ··· 233 218 234 219 qapi_free_UserDefTwo(ud2); 235 220 } 236 - 237 - static void test_visitor_out_struct_errors(TestOutputVisitorData *data, 238 - const void *unused) 239 - { 240 - EnumOne bad_values[] = { ENUM_ONE__MAX, -1 }; 241 - UserDefOne u = {0}; 242 - UserDefOne *pu = &u; 243 - int i; 244 - 245 - for (i = 0; i < ARRAY_SIZE(bad_values) ; i++) { 246 - Error *err = NULL; 247 - 248 - u.has_enum1 = true; 249 - u.enum1 = bad_values[i]; 250 - visit_type_UserDefOne(data->ov, "unused", &pu, &err); 251 - error_free_or_abort(&err); 252 - visitor_reset(data); 253 - } 254 - } 255 - 256 221 257 222 static void test_visitor_out_list(TestOutputVisitorData *data, 258 223 const void *unused) ··· 821 786 &out_visitor_data, test_visitor_out_no_string); 822 787 output_visitor_test_add("/visitor/output/enum", 823 788 &out_visitor_data, test_visitor_out_enum); 824 - output_visitor_test_add("/visitor/output/enum-errors", 825 - &out_visitor_data, test_visitor_out_enum_errors); 826 789 output_visitor_test_add("/visitor/output/struct", 827 790 &out_visitor_data, test_visitor_out_struct); 828 791 output_visitor_test_add("/visitor/output/struct-nested", 829 792 &out_visitor_data, test_visitor_out_struct_nested); 830 - output_visitor_test_add("/visitor/output/struct-errors", 831 - &out_visitor_data, test_visitor_out_struct_errors); 832 793 output_visitor_test_add("/visitor/output/list", 833 794 &out_visitor_data, test_visitor_out_list); 834 795 output_visitor_test_add("/visitor/output/any",
-19
tests/test-string-output-visitor.c
··· 203 203 } 204 204 } 205 205 206 - static void test_visitor_out_enum_errors(TestOutputVisitorData *data, 207 - const void *unused) 208 - { 209 - EnumOne i, bad_values[] = { ENUM_ONE__MAX, -1 }; 210 - 211 - for (i = 0; i < ARRAY_SIZE(bad_values) ; i++) { 212 - Error *err = NULL; 213 - 214 - visit_type_EnumOne(data->ov, "unused", &bad_values[i], &err); 215 - error_free_or_abort(&err); 216 - } 217 - } 218 - 219 206 static void 220 207 output_visitor_test_add(const char *testpath, 221 208 TestOutputVisitorData *data, ··· 260 247 &out_visitor_data, test_visitor_out_enum, false); 261 248 output_visitor_test_add("/string-visitor/output/enum-human", 262 249 &out_visitor_data, test_visitor_out_enum, true); 263 - output_visitor_test_add("/string-visitor/output/enum-errors", 264 - &out_visitor_data, test_visitor_out_enum_errors, 265 - false); 266 - output_visitor_test_add("/string-visitor/output/enum-errors-human", 267 - &out_visitor_data, test_visitor_out_enum_errors, 268 - true); 269 250 output_visitor_test_add("/string-visitor/output/intList", 270 251 &out_visitor_data, test_visitor_out_intList, false); 271 252 output_visitor_test_add("/string-visitor/output/intList-human",