From 79bef893d2aa08a80b3dfb749727df7d57c8bcf3 Mon Sep 17 00:00:00 2001 From: xue_meng_en <1836611252@qq.com> Date: Thu, 9 Mar 2023 16:51:40 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=BF=9C=E7=A8=8B=E8=AE=BE?= =?UTF-8?q?=E7=BD=AEevent=5Ftriggers=E5=8F=82=E6=95=B0=E6=97=B6=E5=87=BA?= =?UTF-8?q?=E9=94=99=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/cm_ctl/ctl_common.cpp | 7 +++---- src/cm_ctl/ctl_guc.cpp | 26 ++++++++++++++++++++++---- src/include/cm/cm_ctl/ctl_common.h | 1 + 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/src/cm_ctl/ctl_common.cpp b/src/cm_ctl/ctl_common.cpp index 260e1b9..b33c87b 100644 --- a/src/cm_ctl/ctl_common.cpp +++ b/src/cm_ctl/ctl_common.cpp @@ -174,19 +174,18 @@ int FindInstanceIdAndType(uint32 node, const char *dataPath, uint32 *instanceId, */ int ssh_exec(const staticNodeConfig* node, const char* cmd, int32 logLevel) { -#define MAXLINE 1024 - char actualCmd[MAXLINE]; + char actualCmd[MAX_COMMAND_LEN] = {0}; int rc = -1; int ret; for (uint32 ii = 0; ii < node->sshCount; ii++) { if (mpp_env_separate_file[0] == '\0') { - ret = snprintf_s(actualCmd, MAXLINE, MAXLINE - 1, + ret = snprintf_s(actualCmd, MAX_COMMAND_LEN, MAX_COMMAND_LEN - 1, "pssh %s -s -H %s \"( %s ) > %s 2>&1\" < %s > /dev/null 2>&1", PSSH_TIMEOUT_OPTION, node->sshChannel[ii], cmd, "/dev/null", "/dev/null"); securec_check_intval(ret, (void)ret); } else { - ret = snprintf_s(actualCmd, MAXLINE, MAXLINE - 1, + ret = snprintf_s(actualCmd, MAX_COMMAND_LEN, MAX_COMMAND_LEN - 1, "pssh %s -s -H %s \"( source %s;%s ) > %s 2>&1\" < %s > /dev/null 2>&1", PSSH_TIMEOUT_OPTION, node->sshChannel[ii], mpp_env_separate_file, cmd, "/dev/null", "/dev/null"); diff --git a/src/cm_ctl/ctl_guc.cpp b/src/cm_ctl/ctl_guc.cpp index f6deb56..ad579ac 100644 --- a/src/cm_ctl/ctl_guc.cpp +++ b/src/cm_ctl/ctl_guc.cpp @@ -308,13 +308,31 @@ static void GetRemoteGucCommand(const CtlOption *ctx, char *cmd, size_t cmdLen) securec_check_intval(ret, (void)ret); curLen = (size_t)ret; - if (ctx->guc.gucCommand == SET_CONF_COMMAND && ctx->guc.value != NULL && ctx->guc.parameter != NULL) { + if (ctx->guc.gucCommand != SET_CONF_COMMAND || ctx->guc.value == NULL || ctx->guc.parameter == NULL) { + return; + } + + if (strcmp(ctx->guc.parameter, "event_triggers") != 0) { ret = snprintf_s((cmd + curLen), (cmdLen - curLen), ((cmdLen - curLen) - 1), SYSTEMQUOTE "-k %s=\\\"%s\\\" " SYSTEMQUOTE, ctx->guc.parameter, ctx->guc.value); securec_check_intval(ret, (void)ret); + } else { + // event_triggers value contain double quotes, so an escape character is added before remote execution + const char *value = ctx->guc.value; + char valueCopy[cmdLen] = {0}; + int j = 0; + for (size_t i = 0; i < strlen(value); ++i) { + if (value[i] == '"') { + valueCopy[j++] = '\\'; + valueCopy[j++] = '\\'; + valueCopy[j++] = '\\'; + } + valueCopy[j++] = value[i]; + } + ret = snprintf_s((cmd + curLen), (cmdLen - curLen), ((cmdLen - curLen) - 1), + SYSTEMQUOTE "-k %s=\\\"%s\\\" " SYSTEMQUOTE, ctx->guc.parameter, valueCopy); + securec_check_intval(ret, (void)ret); } - - return; } static void PrintOneParameterAndValue(char *line) @@ -768,7 +786,7 @@ static status_t ListRemoteConfMain(staticNodeConfig *node, const char *cmd) static status_t ProcessInRemoteInstance(const CtlOption *ctx) { - char remoteCmd[CM_PATH_LENGTH] = {0}; + char remoteCmd[MAX_COMMAND_LEN] = {0}; if (ctx->comm.nodeId == g_currentNode->node) { if (ProcessInLocalInstance(&ctx->guc) == CM_ERROR) { diff --git a/src/include/cm/cm_ctl/ctl_common.h b/src/include/cm/cm_ctl/ctl_common.h index 24f8575..eb88cb1 100644 --- a/src/include/cm/cm_ctl/ctl_common.h +++ b/src/include/cm/cm_ctl/ctl_common.h @@ -38,6 +38,7 @@ #define DYNAMIC_PRIMARY 0 #define DYNAMIC_STANDBY 1 #define RELOAD_WAIT_TIME 60 +#define MAX_COMMAND_LEN 2048 #define ETCD_BIN_NAME "etcd" #ifndef ENABLE_MULTIPLE_NODES