From 06e43a8f9bbe09058e8a4d07047e14888bc19b6f Mon Sep 17 00:00:00 2001 From: openGaussDev Date: Mon, 7 Mar 2022 16:58:00 +0800 Subject: [PATCH] fix the bug that mask password fails when stmt is truncated Offering: openGaussDev More detail: fix the bug that mask password fails when stmt is truncated Signed-off-by: HeRui Match-id-d32724bb606ac2ebae17c2900b160b35c4033a24 --- src/common/backend/utils/error/elog.cpp | 4 +++ src/gausskernel/process/postmaster/pgstat.cpp | 26 ++++++++++++++++--- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/common/backend/utils/error/elog.cpp b/src/common/backend/utils/error/elog.cpp index d5525a58f..95934c221 100644 --- a/src/common/backend/utils/error/elog.cpp +++ b/src/common/backend/utils/error/elog.cpp @@ -3945,6 +3945,10 @@ void getElevelAndSqlstate(int* eLevel, int* sqlState) *sqlState = t_thrd.log_cxt.errordata[t_thrd.log_cxt.errordata_stack_depth].sqlerrcode; } +/* + * When the SQL statement is truncated, this function cannot perform normal password masking. + * maskPassword will return null if the statement does not need to be masked or any error occurs. + */ char* maskPassword(const char* query_string) { char* mask_string = NULL; diff --git a/src/gausskernel/process/postmaster/pgstat.cpp b/src/gausskernel/process/postmaster/pgstat.cpp index cc8ed453b..2fd975b7b 100644 --- a/src/gausskernel/process/postmaster/pgstat.cpp +++ b/src/gausskernel/process/postmaster/pgstat.cpp @@ -3532,9 +3532,29 @@ void pgstat_report_activity(BackendState state, const char* cmd_str) beentry->st_state_start_timestamp = current_timestamp; if (cmd_str != NULL) { - rc = memcpy_s( - (char*)beentry->st_activity, g_instance.attr.attr_common.pgstat_track_activity_query_size, cmd_str, len); - securec_check(rc, "\0", "\0"); + char *mask_string = NULL; + if (len == g_instance.attr.attr_common.pgstat_track_activity_query_size - 1 && + t_thrd.mem_cxt.mask_password_mem_cxt != NULL) { + /* mask the cmd_str when the cmd_str is truncated. */ + mask_string = maskPassword(cmd_str); + } + + /* If mask successfully, store the mask_string. Otherwise, the cmd_str is recorded. */ + if (mask_string == NULL) { + rc = memcpy_s((char*)beentry->st_activity, g_instance.attr.attr_common.pgstat_track_activity_query_size, + cmd_str, len); + securec_check(rc, "\0", "\0"); + } else { + int copy_len = strlen(mask_string); + if (len < copy_len) { + copy_len = len; + } + rc = memcpy_s((char*)beentry->st_activity, g_instance.attr.attr_common.pgstat_track_activity_query_size, + mask_string, copy_len); + securec_check(rc, "\0", "\0"); + pfree(mask_string); + } + beentry->st_activity[len] = '\0'; beentry->st_activity_start_timestamp = start_timestamp; }