From: Ralph Boehme Date: Sun, 26 Oct 2025 08:59:28 +0000 (+0100) Subject: smbd: add FSCTL_SMBTORTURE_[GET_CTDB_PNN|STOP_CTDB_NODE|START_CTDB_NODE] X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f3e6e06aee4bce910a84c4e6de338f6dbe2655ca;p=thirdparty%2Fsamba.git smbd: add FSCTL_SMBTORTURE_[GET_CTDB_PNN|STOP_CTDB_NODE|START_CTDB_NODE] Signed-off-by: Ralph Boehme Reviewed-by: Anoop C S --- diff --git a/libcli/smb/smb_constants.h b/libcli/smb/smb_constants.h index 6d43ec1eb04..ccb07e1b99f 100644 --- a/libcli/smb/smb_constants.h +++ b/libcli/smb/smb_constants.h @@ -647,6 +647,12 @@ enum csc_policy { (FSCTL_SMBTORTURE | FSCTL_ACCESS_WRITE | 0x0020 | FSCTL_METHOD_NEITHER) #define FSCTL_SMBTORTURE_FSP_ASYNC_SLEEP \ (FSCTL_SMBTORTURE | FSCTL_ACCESS_WRITE | 0x0040 | FSCTL_METHOD_NEITHER) +#define FSCTL_SMBTORTURE_GET_CTDB_PNN \ + (FSCTL_SMBTORTURE | FSCTL_ACCESS_WRITE | 0x0080 | FSCTL_METHOD_NEITHER) +#define FSCTL_SMBTORTURE_STOP_CTDB_NODE \ + (FSCTL_SMBTORTURE | FSCTL_ACCESS_WRITE | 0x0100 | FSCTL_METHOD_NEITHER) +#define FSCTL_SMBTORTURE_START_CTDB_NODE \ + (FSCTL_SMBTORTURE | FSCTL_ACCESS_WRITE | 0x0200 | FSCTL_METHOD_NEITHER) /* * A few values from [MS-FSCC] 2.1.2.1 Reparse Tags diff --git a/source3/smbd/smb2_ioctl_smbtorture.c b/source3/smbd/smb2_ioctl_smbtorture.c index 9a259fb0dbf..439a19ac233 100644 --- a/source3/smbd/smb2_ioctl_smbtorture.c +++ b/source3/smbd/smb2_ioctl_smbtorture.c @@ -132,6 +132,70 @@ static void smbd_fsctl_torture_async_sleep_done(struct tevent_req *subreq) tevent_req_done(req); } +static NTSTATUS smbd_fsctl_torture_stop_ctdb_node(uint8_t pnn) +{ + const char *opt = NULL; + char *cmd = NULL; + int ret; + + DBG_WARNING("Received stop node %"PRIu8" request\n", pnn); + + opt = lp_parm_const_string (-1, "clusteredmember", "stop_node", NULL); + if (opt == NULL) { + return NT_STATUS_INTERNAL_ERROR; + } + + cmd = talloc_asprintf(talloc_tos(), "%s %"PRIu8, opt, pnn); + if (cmd == NULL) { + return NT_STATUS_NO_MEMORY; + } + + DBG_WARNING("cmd: '%s'\n", cmd); + + ret = smbrun(cmd, NULL, NULL); + if (ret != 0) { + DBG_WARNING("'%s' failed\n", cmd); + TALLOC_FREE(cmd); + return NT_STATUS_INTERNAL_ERROR; + } + TALLOC_FREE(cmd); + + DBG_WARNING("Finished stop node %"PRIu8" request\n", pnn); + return NT_STATUS_OK; +} + +static NTSTATUS smbd_fsctl_torture_start_ctdb_node(uint8_t pnn) +{ + const char *opt = NULL; + char *cmd = NULL; + int ret; + + DBG_WARNING("Received start node %"PRIu8" request\n", pnn); + + opt = lp_parm_const_string (-1, "clusteredmember", "start_node", NULL); + if (opt == NULL) { + return NT_STATUS_INTERNAL_ERROR; + } + + cmd = talloc_asprintf(talloc_tos(), "%s %"PRIu8, opt, pnn); + if (cmd == NULL) { + return NT_STATUS_NO_MEMORY; + } + + DBG_WARNING("cmd: '%s'\n", cmd); + + ret = smbrun(cmd, NULL, NULL); + if (ret != 0) { + DBG_WARNING("'%s' failed\n", cmd); + TALLOC_FREE(cmd); + return NT_STATUS_INTERNAL_ERROR; + } + TALLOC_FREE(cmd); + + DBG_WARNING("Finished start node %"PRIu8" request\n", pnn); + return NT_STATUS_OK; +} + struct tevent_req *smb2_ioctl_smbtorture(uint32_t ctl_code, struct tevent_context *ev, struct tevent_req *req, @@ -214,6 +278,53 @@ struct tevent_req *smb2_ioctl_smbtorture(uint32_t ctl_code, return req; } + case FSCTL_SMBTORTURE_GET_CTDB_PNN: { + uint32_t pnn = get_my_vnn(); + + if (state->in_input.length != 0) { + tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER); + return tevent_req_post(req, ev); + } + + state->out_output = data_blob_talloc(state, NULL, 1); + if (state->out_output.data == NULL) { + tevent_req_nterror(req, NT_STATUS_NO_MEMORY); + return tevent_req_post(req, ev); + } + + SCVAL(state->out_output.data, 0x00, (uint8_t)pnn); + + tevent_req_done(req); + return tevent_req_post(req, ev); + } + case FSCTL_SMBTORTURE_STOP_CTDB_NODE: + if (state->in_input.length != 1) { + tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER); + return tevent_req_post(req, ev); + } + + status = smbd_fsctl_torture_stop_ctdb_node( + PULL_BE_U8(state->in_input.data, 0)); + if (tevent_req_nterror(req, status)) { + return tevent_req_post(req, ev); + } + tevent_req_done(req); + return tevent_req_post(req, ev); + + case FSCTL_SMBTORTURE_START_CTDB_NODE: + if (state->in_input.length != 1) { + tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER); + return tevent_req_post(req, ev); + } + + status = smbd_fsctl_torture_start_ctdb_node( + PULL_BE_U8(state->in_input.data, 0)); + if (tevent_req_nterror(req, status)) { + return tevent_req_post(req, ev); + } + tevent_req_done(req); + return tevent_req_post(req, ev); + default: goto not_supported; }