From b40cdd229902b40a6f4bb09177996ce995af8525 Mon Sep 17 00:00:00 2001 From: Haibo Yan Date: Fri, 6 Jun 2025 12:39:13 -0700 Subject: [PATCH] Mitigate potential overflow risks from wcscpy and sprintf The use of wcscpy and sprintf for copying user-supplied input into buffers is inherently unsafe and can lead to buffer overflows. This commit replaces wcscpy with wcsncpy and sprintf with snprintf to ensure proper bounds checking and mitigate potential overflow vulnerabilities. --- src/backend/utils/adt/pg_locale.c | 4 ++-- src/backend/utils/misc/guc.c | 18 +++++++++--------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/backend/utils/adt/pg_locale.c b/src/backend/utils/adt/pg_locale.c index f5e31c433a0..e5c64d81de3 100644 --- a/src/backend/utils/adt/pg_locale.c +++ b/src/backend/utils/adt/pg_locale.c @@ -929,7 +929,7 @@ search_locale_enum(LPWSTR pStr, DWORD dwFlags, LPARAM lparam) { if (_wcsicmp(argv[0], test_locale) == 0) { - wcscpy(argv[1], pStr); + wcsncpy(argv[1], pStr, LOCALE_NAME_MAX_LENGTH - 1); *argv[2] = (wchar_t) 1; return FALSE; } @@ -952,7 +952,7 @@ search_locale_enum(LPWSTR pStr, DWORD dwFlags, LPARAM lparam) { if (_wcsicmp(argv[0], test_locale) == 0) { - wcscpy(argv[1], pStr); + wcsncpy(argv[1], pStr, LOCALE_NAME_MAX_LENGTH - 1); *argv[2] = (wchar_t) 1; return FALSE; } diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 667df448732..927c3e52ee2 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -1818,9 +1818,9 @@ SelectConfigFiles(const char *userDoption, const char *progname) } else if (configdir) { - fname = guc_malloc(FATAL, - strlen(configdir) + strlen(CONFIG_FILENAME) + 2); - sprintf(fname, "%s/%s", configdir, CONFIG_FILENAME); + size_t len = strlen(configdir) + strlen(CONFIG_FILENAME) + 2; + fname = guc_malloc(FATAL, len); + snprintf(fname, len, "%s/%s", configdir, CONFIG_FILENAME); fname_is_malloced = false; } else @@ -1921,9 +1921,9 @@ SelectConfigFiles(const char *userDoption, const char *progname) } else if (configdir) { - fname = guc_malloc(FATAL, - strlen(configdir) + strlen(HBA_FILENAME) + 2); - sprintf(fname, "%s/%s", configdir, HBA_FILENAME); + size_t len = strlen(configdir) + strlen(HBA_FILENAME) + 2; + fname = guc_malloc(FATAL, len); + snprintf(fname, len, "%s/%s", configdir, HBA_FILENAME); fname_is_malloced = false; } else @@ -1952,9 +1952,9 @@ SelectConfigFiles(const char *userDoption, const char *progname) } else if (configdir) { - fname = guc_malloc(FATAL, - strlen(configdir) + strlen(IDENT_FILENAME) + 2); - sprintf(fname, "%s/%s", configdir, IDENT_FILENAME); + size_t len = strlen(configdir) + strlen(IDENT_FILENAME) + 2; + fname = guc_malloc(FATAL, len); + snprintf(fname, len, "%s/%s", configdir, IDENT_FILENAME); fname_is_malloced = false; } else -- 2.49.0