From: Günther Deschner Date: Tue, 30 Aug 2016 17:37:18 +0000 (+0200) Subject: s4-torture: dump ndr packet in ndr tests with high log level X-Git-Tag: talloc-2.3.1~568 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=fd20153e8b095fa9a82a024c3f7bebd809ba132f;p=thirdparty%2Fsamba.git s4-torture: dump ndr packet in ndr tests with high log level Guenther Signed-off-by: Guenther Deschner Reviewed-by: Jeremy Allison --- diff --git a/source4/torture/ndr/ndr.c b/source4/torture/ndr/ndr.c index 08236acb281..e65a39ddb7f 100644 --- a/source4/torture/ndr/ndr.c +++ b/source4/torture/ndr/ndr.c @@ -31,6 +31,8 @@ struct ndr_pull_test_data { size_t struct_size; ndr_pull_flags_fn_t pull_fn; ndr_push_flags_fn_t push_fn; + ndr_print_fn_t print_fn; + ndr_print_function_t print_function; int ndr_flags; int flags; }; @@ -52,6 +54,46 @@ static enum ndr_err_code torture_ndr_push_struct_blob_flags(DATA_BLOB *blob, TAL return NDR_ERR_SUCCESS; } +static bool torture_ndrdump(struct torture_context *tctx, + struct ndr_pull *ndr, + const struct ndr_pull_test_data *data, + uint32_t flags, + void *ds, + const char *name) +{ + struct ndr_print *ndr_print; + const char *name_raw; + uint32_t ndr_flags = data->ndr_flags | flags; + + ndr_print = talloc_zero(tctx, struct ndr_print); + torture_assert(tctx, ndr_print, "out of memory"); + + if (DEBUGLEVEL >= 10) { + ndr_print->print = ndr_print_debug_helper; + } else { + ndr_print->print = ndr_print_string_helper; + } + + ndr_print->depth = 1; + + torture_assert(tctx, ndr_flags, "no flags have been set"); + + if (ndr_flags & (NDR_BUFFERS|NDR_SCALARS)) { + data->print_fn(ndr_print, name, ds); + } else { + data->print_function(ndr_print, name, ndr_flags, ds); + } + + name_raw = talloc_asprintf(tctx, "%s (RAW DATA)", name); + torture_assert(tctx, name_raw, "out of memory"); + + ndr_print_DATA_BLOB(ndr_print, name_raw, data->data); + + talloc_free(ndr_print); + + return true; +} + static bool wrap_ndr_pullpush_test(struct torture_context *tctx, struct torture_tcase *tcase, struct torture_test *test) @@ -60,9 +102,13 @@ static bool wrap_ndr_pullpush_test(struct torture_context *tctx, const struct ndr_pull_test_data *data = (const struct ndr_pull_test_data *)test->data; struct ndr_pull *ndr = ndr_pull_init_blob(&(data->data), tctx); void *ds = talloc_zero_size(ndr, data->struct_size); - bool ret; + bool ret = true; uint32_t highest_ofs; + torture_assert(tctx, data, "out of memory"); + torture_assert(tctx, ndr, "out of memory"); + torture_assert(tctx, ds, "out of memory"); + ndr->flags |= data->flags; ndr->flags |= LIBNDR_FLAG_REF_ALLOC; @@ -86,6 +132,8 @@ static bool wrap_ndr_pullpush_test(struct torture_context *tctx, ret = true; } + torture_ndrdump(tctx, ndr, data, data->ndr_flags, ds, "ds"); + if (data->push_fn != NULL) { DATA_BLOB outblob; torture_assert_ndr_success(tctx, torture_ndr_push_struct_blob_flags(&outblob, ndr, data->ndr_flags, ndr->flags, ds, data->push_fn), "pushing"); @@ -101,6 +149,8 @@ _PUBLIC_ struct torture_test *_torture_suite_add_ndr_pullpush_test( const char *name, ndr_pull_flags_fn_t pull_fn, ndr_push_flags_fn_t push_fn, + ndr_print_fn_t print_fn, + ndr_print_function_t print_function, DATA_BLOB db, size_t struct_size, int ndr_flags, @@ -119,13 +169,15 @@ _PUBLIC_ struct torture_test *_torture_suite_add_ndr_pullpush_test( test->description = NULL; test->run = wrap_ndr_pullpush_test; - data = talloc(test, struct ndr_pull_test_data); + data = talloc_zero(test, struct ndr_pull_test_data); data->data = db; data->ndr_flags = ndr_flags; data->flags = flags; data->struct_size = struct_size; data->pull_fn = pull_fn; data->push_fn = push_fn; + data->print_fn = print_fn; + data->print_function = print_function; test->data = data; test->fn = check_fn; @@ -146,6 +198,10 @@ static bool wrap_ndr_inout_pull_test(struct torture_context *tctx, void *ds = talloc_zero_size(tctx, data->struct_size); struct ndr_pull *ndr; uint32_t highest_ofs; + bool ret = false; + + torture_assert(tctx, data, "out of memory"); + torture_assert(tctx, ds, "out of memory"); /* handle NDR_IN context */ @@ -168,6 +224,8 @@ static bool wrap_ndr_inout_pull_test(struct torture_context *tctx, torture_assert(tctx, highest_ofs == ndr->data_size, talloc_asprintf(tctx, "%d unread bytes", ndr->data_size - highest_ofs)); + torture_ndrdump(tctx, ndr, data, NDR_IN, ds, "ds"); + talloc_free(ndr); /* handle NDR_OUT */ @@ -191,18 +249,24 @@ static bool wrap_ndr_inout_pull_test(struct torture_context *tctx, torture_assert(tctx, highest_ofs == ndr->data_size, talloc_asprintf(tctx, "%d unread bytes", ndr->data_size - highest_ofs)); - talloc_free(ndr); - if (check_fn) { - return check_fn(tctx, ds); + ret = check_fn(tctx, ds); } else { - return true; + ret = true; } + + torture_ndrdump(tctx, ndr, data, NDR_OUT, ds, "ds"); + + talloc_free(ndr); + + return ret; } _PUBLIC_ struct torture_test *_torture_suite_add_ndr_pull_inout_test( struct torture_suite *suite, - const char *name, ndr_pull_flags_fn_t pull_fn, + const char *name, + ndr_pull_flags_fn_t pull_fn, + ndr_print_function_t print_function, DATA_BLOB db_in, DATA_BLOB db_out, size_t struct_size, @@ -220,13 +284,14 @@ _PUBLIC_ struct torture_test *_torture_suite_add_ndr_pull_inout_test( test->name = talloc_strdup(test, name); test->description = NULL; test->run = wrap_ndr_inout_pull_test; - data = talloc(test, struct ndr_pull_test_data); + data = talloc_zero(test, struct ndr_pull_test_data); data->data = db_out; data->data_context = db_in; data->ndr_flags = 0; data->flags = flags; data->struct_size = struct_size; data->pull_fn = pull_fn; + data->print_function = print_function; test->data = data; test->fn = check_fn; test->dangerous = false; diff --git a/source4/torture/ndr/ndr.h b/source4/torture/ndr/ndr.h index 53b64e08813..58ab19354ab 100644 --- a/source4/torture/ndr/ndr.h +++ b/source4/torture/ndr/ndr.h @@ -29,6 +29,8 @@ _PUBLIC_ struct torture_test *_torture_suite_add_ndr_pullpush_test( const char *name, ndr_pull_flags_fn_t pull_fn, ndr_push_flags_fn_t push_fn, + ndr_print_fn_t print_fn, + ndr_print_function_t print_function, DATA_BLOB db, size_t struct_size, int ndr_flags, @@ -37,7 +39,9 @@ _PUBLIC_ struct torture_test *_torture_suite_add_ndr_pullpush_test( _PUBLIC_ struct torture_test *_torture_suite_add_ndr_pull_inout_test( struct torture_suite *suite, - const char *name, ndr_pull_flags_fn_t pull_fn, + const char *name, + ndr_pull_flags_fn_t pull_fn, + ndr_print_function_t print_fn, DATA_BLOB db_in, DATA_BLOB db_out, size_t struct_size, @@ -48,6 +52,8 @@ _PUBLIC_ struct torture_test *_torture_suite_add_ndr_pull_inout_test( _torture_suite_add_ndr_pullpush_test(suite, #name, \ (ndr_pull_flags_fn_t)ndr_pull_ ## name, \ NULL, \ + (ndr_print_fn_t)ndr_print_ ## name, \ + NULL, \ data_blob_const(data, sizeof(data)), \ sizeof(struct name), \ NDR_SCALARS|NDR_BUFFERS, 0, \ @@ -57,6 +63,8 @@ _PUBLIC_ struct torture_test *_torture_suite_add_ndr_pull_inout_test( _torture_suite_add_ndr_pullpush_test(suite, #name "_" #flags, \ (ndr_pull_flags_fn_t)ndr_pull_ ## name, \ NULL, \ + NULL, \ + (ndr_print_function_t)ndr_print_ ## name, \ data_blob_const(data, sizeof(data)), \ sizeof(struct name), \ flags, 0, \ @@ -66,6 +74,8 @@ _PUBLIC_ struct torture_test *_torture_suite_add_ndr_pull_inout_test( _torture_suite_add_ndr_pullpush_test(suite, #name "_" #flags "_" #flags2, \ (ndr_pull_flags_fn_t)ndr_pull_ ## name, \ NULL, \ + NULL, \ + (ndr_print_function_t)ndr_print_ ## name, \ data_blob_const(data, sizeof(data)), \ sizeof(struct name), \ flags, flags2, \ @@ -75,6 +85,8 @@ _PUBLIC_ struct torture_test *_torture_suite_add_ndr_pull_inout_test( _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, \ + (ndr_print_fn_t)ndr_print_ ## name, \ + NULL, \ data_blob_const(data, sizeof(data)), \ sizeof(struct name), \ NDR_SCALARS|NDR_BUFFERS, 0, \ @@ -84,6 +96,8 @@ _PUBLIC_ struct torture_test *_torture_suite_add_ndr_pull_inout_test( _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, \ + (ndr_print_fn_t)ndr_print_ ## name, \ + NULL, \ data_blob, \ sizeof(struct name), \ NDR_SCALARS|NDR_BUFFERS, 0, \ @@ -93,6 +107,8 @@ _PUBLIC_ struct torture_test *_torture_suite_add_ndr_pull_inout_test( _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, \ + (ndr_print_fn_t)ndr_print_ ## name, \ + NULL, \ base64_decode_data_blob_talloc(suite, b64), \ sizeof(struct name), \ NDR_SCALARS|NDR_BUFFERS, 0, \ @@ -102,6 +118,8 @@ _PUBLIC_ struct torture_test *_torture_suite_add_ndr_pull_inout_test( _torture_suite_add_ndr_pullpush_test(suite, #name, \ (ndr_pull_flags_fn_t)ndr_pull_ ## name, \ (ndr_push_flags_fn_t)ndr_push_ ## name, \ + NULL, \ + (ndr_print_function_t)ndr_print_ ## name, \ data_blob_const(data, sizeof(data)), \ sizeof(struct name), \ flags, flags2, \ @@ -110,6 +128,7 @@ _PUBLIC_ struct torture_test *_torture_suite_add_ndr_pull_inout_test( #define torture_suite_add_ndr_pull_io_test(suite,name,data_in,data_out,check_fn_out) \ _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, \ data_blob_const(data_in, sizeof(data_in)), \ data_blob_const(data_out, sizeof(data_out)), \ sizeof(struct name), \ @@ -119,6 +138,7 @@ _PUBLIC_ struct torture_test *_torture_suite_add_ndr_pull_inout_test( #define torture_suite_add_ndr_pull_io_test_flags(suite,name,data_in,data_out,flags,check_fn_out) \ _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, \ data_blob_const(data_in, sizeof(data_in)), \ data_blob_const(data_out, sizeof(data_out)), \ sizeof(struct name), \