mirror of
https://github.com/samba-team/samba.git
synced 2024-12-23 17:34:34 +03:00
ndrdump: add --stop-on-parse-failure
If a data stream fails to parse as an NDR object, the default ndrdump action is to try to print those structures anyway, resulting perhaps in a NULL dereference. Sometimes you don't want to see that because it isn't very interesting and makes it harder to distinguish a crash in the parse routines. So --stop-on-parse-failure will skip the print and validate stages altogether if the parse failed. Signed-off-by: Douglas Bagnall <douglas.bagnall@catalyst.net.nz> Pair-programmed-with: Andrew Bartlett <abartlet@samba.org>
This commit is contained in:
parent
a106ceb7bf
commit
dfbb304958
@ -261,8 +261,18 @@ static void ndr_print_dummy(struct ndr_print *ndr, const char *format, ...)
|
|||||||
bool assume_ndr64 = false;
|
bool assume_ndr64 = false;
|
||||||
bool quiet = false;
|
bool quiet = false;
|
||||||
bool hex_input = false;
|
bool hex_input = false;
|
||||||
|
bool stop_on_parse_failure = false;
|
||||||
int opt;
|
int opt;
|
||||||
enum {OPT_CONTEXT_FILE=1000, OPT_VALIDATE, OPT_DUMP_DATA, OPT_LOAD_DSO, OPT_NDR64, OPT_QUIET, OPT_HEX_INPUT};
|
enum {
|
||||||
|
OPT_CONTEXT_FILE=1000,
|
||||||
|
OPT_VALIDATE,
|
||||||
|
OPT_DUMP_DATA,
|
||||||
|
OPT_LOAD_DSO,
|
||||||
|
OPT_NDR64,
|
||||||
|
OPT_QUIET,
|
||||||
|
OPT_HEX_INPUT,
|
||||||
|
OPT_STOP_ON_PARSE_FAILURE,
|
||||||
|
};
|
||||||
struct poptOption long_options[] = {
|
struct poptOption long_options[] = {
|
||||||
POPT_AUTOHELP
|
POPT_AUTOHELP
|
||||||
{"context-file", 'c', POPT_ARG_STRING, NULL, OPT_CONTEXT_FILE, "In-filename to parse first", "CTX-FILE" },
|
{"context-file", 'c', POPT_ARG_STRING, NULL, OPT_CONTEXT_FILE, "In-filename to parse first", "CTX-FILE" },
|
||||||
@ -272,6 +282,8 @@ static void ndr_print_dummy(struct ndr_print *ndr, const char *format, ...)
|
|||||||
{"ndr64", 0, POPT_ARG_NONE, NULL, OPT_NDR64, "Assume NDR64 data", NULL },
|
{"ndr64", 0, POPT_ARG_NONE, NULL, OPT_NDR64, "Assume NDR64 data", NULL },
|
||||||
{"quiet", 0, POPT_ARG_NONE, NULL, OPT_QUIET, "Don't actually dump anything", NULL },
|
{"quiet", 0, POPT_ARG_NONE, NULL, OPT_QUIET, "Don't actually dump anything", NULL },
|
||||||
{"hex-input", 0, POPT_ARG_NONE, NULL, OPT_HEX_INPUT, "Read the input file in as a hex dump", NULL },
|
{"hex-input", 0, POPT_ARG_NONE, NULL, OPT_HEX_INPUT, "Read the input file in as a hex dump", NULL },
|
||||||
|
{"stop-on-parse-failure", 0, POPT_ARG_NONE, NULL, OPT_STOP_ON_PARSE_FAILURE,
|
||||||
|
"Do not try to print structures that fail to parse.", NULL },
|
||||||
POPT_COMMON_SAMBA
|
POPT_COMMON_SAMBA
|
||||||
POPT_COMMON_VERSION
|
POPT_COMMON_VERSION
|
||||||
{ NULL }
|
{ NULL }
|
||||||
@ -316,6 +328,9 @@ static void ndr_print_dummy(struct ndr_print *ndr, const char *format, ...)
|
|||||||
case OPT_HEX_INPUT:
|
case OPT_HEX_INPUT:
|
||||||
hex_input = true;
|
hex_input = true;
|
||||||
break;
|
break;
|
||||||
|
case OPT_STOP_ON_PARSE_FAILURE:
|
||||||
|
stop_on_parse_failure = true;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -509,6 +524,11 @@ static void ndr_print_dummy(struct ndr_print *ndr, const char *format, ...)
|
|||||||
|
|
||||||
printf("pull returned %s\n", nt_errstr(status));
|
printf("pull returned %s\n", nt_errstr(status));
|
||||||
|
|
||||||
|
if (stop_on_parse_failure && !NT_STATUS_IS_OK(status)) {
|
||||||
|
printf("not printing because --stop-on-parse-failure\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
if (ndr_pull->offset > ndr_pull->relative_highest_offset) {
|
if (ndr_pull->offset > ndr_pull->relative_highest_offset) {
|
||||||
highest_ofs = ndr_pull->offset;
|
highest_ofs = ndr_pull->offset;
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
Reference in New Issue
Block a user