From f0a1f1789c3c96a654ccaa0f803e247070be117b Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Fri, 31 Jul 2020 13:20:09 +0200 Subject: [PATCH] torture/ndr: make check functions typesafe BUG: https://bugzilla.samba.org/show_bug.cgi?id=14452 Signed-off-by: Stefan Metzmacher Reviewed-by: Samuel Cabrero --- source4/torture/ndr/lsa.c | 3 +- source4/torture/ndr/ndr.h | 73 ++++++++++++++++++++++++++++++++++----- 2 files changed, 65 insertions(+), 11 deletions(-) diff --git a/source4/torture/ndr/lsa.c b/source4/torture/ndr/lsa.c index c83c5247d59..6b9a5bcc53d 100644 --- a/source4/torture/ndr/lsa.c +++ b/source4/torture/ndr/lsa.c @@ -1631,8 +1631,7 @@ static const uint8_t lsarlookupnames3_in_data[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; -static bool lsarlookupnames3_in_check(struct torture_context *tctx, - struct lsa_LookupNames2 *r) +static bool lsarlookupnames3_in_check(struct torture_context *tctx, struct lsa_LookupNames3 *r) { /* FIXME: Handle */ torture_assert_int_equal(tctx, r->in.num_names, 7, "num names"); diff --git a/source4/torture/ndr/ndr.h b/source4/torture/ndr/ndr.h index 0cc21825fb4..84d691e6ced 100644 --- a/source4/torture/ndr/ndr.h +++ b/source4/torture/ndr/ndr.h @@ -59,6 +59,11 @@ _PUBLIC_ struct torture_test *_torture_suite_add_ndr_pull_invalid_data_test( enum ndr_err_code ndr_err); #define torture_suite_add_ndr_pull_test(suite,name,data,check_fn) \ + do { \ + bool (*check_fn_typed) (struct torture_context *, struct name *) = \ + check_fn; \ + bool (*check_fn_anon) (struct torture_context *, void *) = \ + (bool (*) (struct torture_context *, void *)) check_fn_typed; \ _torture_suite_add_ndr_pullpush_test(suite, #name, \ (ndr_pull_flags_fn_t)ndr_pull_ ## name, \ NULL, \ @@ -67,7 +72,8 @@ _PUBLIC_ struct torture_test *_torture_suite_add_ndr_pull_invalid_data_test( data_blob_const(data, sizeof(data)), \ sizeof(struct name), \ NDR_SCALARS|NDR_BUFFERS, 0, \ - (bool (*) (struct torture_context *, void *)) check_fn); + check_fn_anon); \ + } while(0) #define torture_suite_add_ndr_pull_invalid_data_test(suite,name,data,ndr_err) \ _torture_suite_add_ndr_pull_invalid_data_test( \ @@ -80,6 +86,11 @@ _PUBLIC_ struct torture_test *_torture_suite_add_ndr_pull_invalid_data_test( ndr_err); #define torture_suite_add_ndr_pull_fn_test(suite,name,data,flags,check_fn) \ + do { \ + bool (*check_fn_typed) (struct torture_context *, struct name *) = \ + check_fn; \ + bool (*check_fn_anon) (struct torture_context *, void *) = \ + (bool (*) (struct torture_context *, void *)) check_fn_typed; \ _torture_suite_add_ndr_pullpush_test(suite, #name "_" #flags, \ (ndr_pull_flags_fn_t)ndr_pull_ ## name, \ NULL, \ @@ -88,9 +99,15 @@ _PUBLIC_ struct torture_test *_torture_suite_add_ndr_pull_invalid_data_test( data_blob_const(data, sizeof(data)), \ sizeof(struct name), \ flags, 0, \ - (bool (*) (struct torture_context *, void *)) check_fn); + check_fn_anon); \ + } while(0) #define torture_suite_add_ndr_pull_fn_test_flags(suite,name,data,flags,flags2,check_fn) \ + do { \ + bool (*check_fn_typed) (struct torture_context *, struct name *) = \ + check_fn; \ + bool (*check_fn_anon) (struct torture_context *, void *) = \ + (bool (*) (struct torture_context *, void *)) check_fn_typed; \ _torture_suite_add_ndr_pullpush_test(suite, #name "_" #flags "_" #flags2, \ (ndr_pull_flags_fn_t)ndr_pull_ ## name, \ NULL, \ @@ -99,9 +116,15 @@ _PUBLIC_ struct torture_test *_torture_suite_add_ndr_pull_invalid_data_test( data_blob_const(data, sizeof(data)), \ sizeof(struct name), \ flags, flags2, \ - (bool (*) (struct torture_context *, void *)) check_fn); + check_fn_anon); \ + } while(0) #define torture_suite_add_ndr_pull_validate_test(suite,name,data,check_fn) \ + do { \ + bool (*check_fn_typed) (struct torture_context *, struct name *) = \ + check_fn; \ + bool (*check_fn_anon) (struct torture_context *, void *) = \ + (bool (*) (struct torture_context *, void *)) check_fn_typed; \ _torture_suite_add_ndr_pullpush_test(suite, #name "_VALIDATE", \ (ndr_pull_flags_fn_t)ndr_pull_ ## name, \ (ndr_push_flags_fn_t)ndr_push_ ## name, \ @@ -110,9 +133,15 @@ _PUBLIC_ struct torture_test *_torture_suite_add_ndr_pull_invalid_data_test( data_blob_const(data, sizeof(data)), \ sizeof(struct name), \ NDR_SCALARS|NDR_BUFFERS, 0, \ - (bool (*) (struct torture_context *, void *)) check_fn); + check_fn_anon); \ + } while(0) #define torture_suite_add_ndr_pull_validate_test_blob(suite,name,data_blob,check_fn) \ + do { \ + bool (*check_fn_typed) (struct torture_context *, struct name *) = \ + check_fn; \ + bool (*check_fn_anon) (struct torture_context *, void *) = \ + (bool (*) (struct torture_context *, void *)) check_fn_typed; \ _torture_suite_add_ndr_pullpush_test(suite, #name "_VALIDATE", \ (ndr_pull_flags_fn_t)ndr_pull_ ## name, \ (ndr_push_flags_fn_t)ndr_push_ ## name, \ @@ -121,9 +150,15 @@ _PUBLIC_ struct torture_test *_torture_suite_add_ndr_pull_invalid_data_test( data_blob, \ sizeof(struct name), \ NDR_SCALARS|NDR_BUFFERS, 0, \ - (bool (*) (struct torture_context *, void *)) check_fn); + check_fn_anon); \ + } while(0) #define torture_suite_add_ndr_pull_validate_test_b64(suite,name,tname,b64,check_fn) \ + do { \ + bool (*check_fn_typed) (struct torture_context *, struct name *) = \ + check_fn; \ + bool (*check_fn_anon) (struct torture_context *, void *) = \ + (bool (*) (struct torture_context *, void *)) check_fn_typed; \ _torture_suite_add_ndr_pullpush_test(suite, #name "_" tname, \ (ndr_pull_flags_fn_t)ndr_pull_ ## name, \ (ndr_push_flags_fn_t)ndr_push_ ## name, \ @@ -132,9 +167,15 @@ _PUBLIC_ struct torture_test *_torture_suite_add_ndr_pull_invalid_data_test( base64_decode_data_blob_talloc(suite, b64), \ sizeof(struct name), \ NDR_SCALARS|NDR_BUFFERS, 0, \ - (bool (*) (struct torture_context *, void *)) check_fn); + check_fn_anon); \ + } while(0) #define torture_suite_add_ndr_pullpush_fn_test_flags(suite,name,data,flags,flags2,check_fn) \ + do { \ + bool (*check_fn_typed) (struct torture_context *, struct name *) = \ + check_fn; \ + bool (*check_fn_anon) (struct torture_context *, void *) = \ + (bool (*) (struct torture_context *, void *)) check_fn_typed; \ _torture_suite_add_ndr_pullpush_test(suite, #name, \ (ndr_pull_flags_fn_t)ndr_pull_ ## name, \ (ndr_push_flags_fn_t)ndr_push_ ## name, \ @@ -143,9 +184,15 @@ _PUBLIC_ struct torture_test *_torture_suite_add_ndr_pull_invalid_data_test( data_blob_const(data, sizeof(data)), \ sizeof(struct name), \ flags, flags2, \ - (bool (*) (struct torture_context *, void *)) check_fn); + check_fn_anon); \ + } while(0) #define torture_suite_add_ndr_pull_io_test(suite,name,data_in,data_out,check_fn_out) \ + do { \ + bool (*check_fn_typed) (struct torture_context *, struct name *) = \ + check_fn_out; \ + bool (*check_fn_anon) (struct torture_context *, void *) = \ + (bool (*) (struct torture_context *, void *)) check_fn_typed; \ _torture_suite_add_ndr_pull_inout_test(suite, #name "_INOUT", \ (ndr_pull_flags_fn_t)ndr_pull_ ## name, \ (ndr_print_function_t)ndr_print_ ## name, \ @@ -153,9 +200,15 @@ _PUBLIC_ struct torture_test *_torture_suite_add_ndr_pull_invalid_data_test( data_blob_const(data_out, sizeof(data_out)), \ sizeof(struct name), \ 0, \ - (bool (*) (struct torture_context *, void *)) check_fn_out); + check_fn_anon); \ + } while(0) #define torture_suite_add_ndr_pull_io_test_flags(suite,name,data_in,data_out,flags,check_fn_out) \ + do { \ + bool (*check_fn_typed) (struct torture_context *, struct name *) = \ + check_fn_out; \ + bool (*check_fn_anon) (struct torture_context *, void *) = \ + (bool (*) (struct torture_context *, void *)) check_fn_typed; \ _torture_suite_add_ndr_pull_inout_test(suite, #name "_INOUT_" #flags, \ (ndr_pull_flags_fn_t)ndr_pull_ ## name, \ (ndr_print_function_t)ndr_print_ ## name, \ @@ -163,5 +216,7 @@ _PUBLIC_ struct torture_test *_torture_suite_add_ndr_pull_invalid_data_test( data_blob_const(data_out, sizeof(data_out)), \ sizeof(struct name), \ flags, \ - (bool (*) (struct torture_context *, void *)) check_fn_out); + check_fn_anon); \ + } while(0) + #endif /* __TORTURE_NDR_H__ */