From 8167486b99920f48db48ebc1574b5c8032647555 Mon Sep 17 00:00:00 2001 From: Gary Lockyer Date: Tue, 11 Dec 2018 11:04:25 +1300 Subject: [PATCH] s4 messaging: support smbcontrol inject fault command Add support of the smbcontrol inject fault command to the samba daemon. This is useful for manual testing of process restart etc. command is only enabled for developer and self test builds Signed-off-by: Gary Lockyer Reviewed-by: Andrew Bartlett --- selftest/knownfail.d/smbcontrol | 2 - source3/utils/smbcontrol.c | 8 +- source4/lib/messaging/messaging.c | 10 +++ source4/lib/messaging/messaging_handlers.c | 88 ++++++++++++++++++++++ source4/lib/messaging/messaging_internal.h | 2 + source4/lib/messaging/wscript_build | 2 +- 6 files changed, 105 insertions(+), 7 deletions(-) delete mode 100644 selftest/knownfail.d/smbcontrol create mode 100644 source4/lib/messaging/messaging_handlers.c diff --git a/selftest/knownfail.d/smbcontrol b/selftest/knownfail.d/smbcontrol deleted file mode 100644 index 01964fb27a0..00000000000 --- a/selftest/knownfail.d/smbcontrol +++ /dev/null @@ -1,2 +0,0 @@ -^samba.tests.blackbox.smbcontrol_process.samba.tests.blackbox.smbcontrol_process.SmbcontrolProcessBlockboxTests.test_inject_fault\(preforkrestartdc:local\) -^samba.tests.blackbox.smbcontrol_process.python3.samba.tests.blackbox.smbcontrol_process.SmbcontrolProcessBlockboxTests.test_inject_fault\(preforkrestartdc:local\) diff --git a/source3/utils/smbcontrol.c b/source3/utils/smbcontrol.c index 866217c248b..8ba31c9f841 100644 --- a/source3/utils/smbcontrol.c +++ b/source3/utils/smbcontrol.c @@ -380,11 +380,11 @@ static bool do_inject_fault(struct tevent_context *ev_ctx, return False; } -#ifndef DEVELOPER +#if !defined(DEVELOPER) && !defined(ENABLE_SELFTEST) fprintf(stderr, "Fault injection is only available in " - "developer builds\n"); + "developer and self test builds\n"); return False; -#else /* DEVELOPER */ +#else /* DEVELOPER || ENABLE_SELFTEST */ { int sig = 0; @@ -407,7 +407,7 @@ static bool do_inject_fault(struct tevent_context *ev_ctx, return send_message(msg_ctx, pid, MSG_SMB_INJECT_FAULT, &sig, sizeof(int)); } -#endif /* DEVELOPER */ +#endif /* DEVELOPER || ENABLE_SELFTEST */ } /* Force a browser election */ diff --git a/source4/lib/messaging/messaging.c b/source4/lib/messaging/messaging.c index 413a19445eb..59c48cd44cb 100644 --- a/source4/lib/messaging/messaging.c +++ b/source4/lib/messaging/messaging.c @@ -464,6 +464,16 @@ static struct imessaging_context *imessaging_init_internal(TALLOC_CTX *mem_ctx, if (!NT_STATUS_IS_OK(status)) { goto fail; } +#if defined(DEVELOPER) || defined(ENABLE_SELFTEST) + /* + * Register handlers for messages specific to developer and + * self test builds + */ + status = imessaging_register_extra_handlers(msg); + if (!NT_STATUS_IS_OK(status)) { + goto fail; + } +#endif /* defined(DEVELOPER) || defined(ENABLE_SELFTEST) */ DLIST_ADD(msg_ctxs, msg); diff --git a/source4/lib/messaging/messaging_handlers.c b/source4/lib/messaging/messaging_handlers.c new file mode 100644 index 00000000000..97b326ee568 --- /dev/null +++ b/source4/lib/messaging/messaging_handlers.c @@ -0,0 +1,88 @@ +/* + Unix SMB/CIFS implementation. + + Handers for non core Samba internal messages + + Handlers for messages that are only included in developer and self test + builds. + + Copyright (C) Andrew Bartlett 2018 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#if defined(DEVELOPER) || defined(ENABLE_SELFTEST) + +#include "includes.h" +#include "lib/util/server_id.h" +#include "messaging/messaging.h" +#include "messaging/messaging_internal.h" + +/* + * Inject a fault into the currently running process + */ +static void do_inject_fault(struct imessaging_context *msg, + void *private_data, + uint32_t msg_type, + struct server_id src, + DATA_BLOB *data) +{ + int sig; + struct server_id_buf tmp; + + if (data->length != sizeof(sig)) { + DBG_ERR("Process %s sent bogus signal injection request\n", + server_id_str_buf(src, &tmp)); + return; + } + + sig = *(int *)data->data; + if (sig == -1) { + DBG_ERR("Process %s requested an iternal failure, " + "calling exit(1)\n", + server_id_str_buf(src, &tmp)); + exit(1); + } + +#if HAVE_STRSIGNAL + DBG_ERR("Process %s requested injection of signal %d (%s)\n", + server_id_str_buf(src, &tmp), + sig, + strsignal(sig)); +#else + DBG_ERR("Process %s requested injection of signal %d\n", + server_id_str_buf(src, &tmp), + sig); +#endif + + kill(getpid(), sig); +} + +/* + * Register the extra messaging handlers + */ +NTSTATUS imessaging_register_extra_handlers(struct imessaging_context *msg) +{ + NTSTATUS status; + + status = imessaging_register( + msg, NULL, MSG_SMB_INJECT_FAULT, do_inject_fault); + if (!NT_STATUS_IS_OK(status)) { + return status; + } + + return NT_STATUS_OK; +} + +#endif /* defined(DEVELOPER) || defined(ENABLE_SELFTEST) */ diff --git a/source4/lib/messaging/messaging_internal.h b/source4/lib/messaging/messaging_internal.h index 93c5c4bdd7b..5e99734ad60 100644 --- a/source4/lib/messaging/messaging_internal.h +++ b/source4/lib/messaging/messaging_internal.h @@ -34,3 +34,5 @@ struct imessaging_context { struct timeval start_time; void *msg_dgm_ref; }; + +NTSTATUS imessaging_register_extra_handlers(struct imessaging_context *msg); diff --git a/source4/lib/messaging/wscript_build b/source4/lib/messaging/wscript_build index 92f231a62b6..878ff647425 100644 --- a/source4/lib/messaging/wscript_build +++ b/source4/lib/messaging/wscript_build @@ -8,7 +8,7 @@ bld.SAMBA_LIBRARY('MESSAGING_SEND', ) bld.SAMBA_LIBRARY('MESSAGING', - source='messaging.c', + source='messaging.c messaging_handlers.c', public_deps='samba-util NDR_IRPC UNIX_PRIVS cluster ndr dcerpc messages_util server_id_db talloc_report', private_library=True ) -- 2.34.1