s4-torture: dump ndr packet in ndr tests with high log level
authorGünther Deschner <gd@samba.org>
Tue, 30 Aug 2016 17:37:18 +0000 (19:37 +0200)
committerJeremy Allison <jra@samba.org>
Thu, 26 Sep 2019 18:41:26 +0000 (18:41 +0000)
Guenther

Signed-off-by: Guenther Deschner <gd@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
source4/torture/ndr/ndr.c
source4/torture/ndr/ndr.h

index 08236acb2814f997864845b0288b35c6fbb7592e..e65a39ddb7f90b3a074aa6be2c50cb906152f993 100644 (file)
@@ -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;
index 53b64e0881314851ccd9a7bff953d5942319e3f8..58ab19354ab5482008e857c8ec95d051717a1442 100644 (file)
@@ -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), \