From 7d3d72b55edd1b7552a9a358991555994efab0e9 Mon Sep 17 00:00:00 2001 From: Thomas Munro Date: Thu, 20 Apr 2023 13:15:23 +1200 Subject: [PATCH] Remove obsolete defense against strxfrm() bugs. Old versions of Solaris and illumos had buffer overrun bugs in their strxfrm() implementations. The bugs were fixed more than a decade ago and the relevant releases are long out of vendor support. It's time to remove the defense added by commit be8b06c3. Reviewed-by: Nathan Bossart Reviewed-by: Tom Lane Discussion: https://postgr.es/m/CA+hUKGJ-ZPJwKHVLbqye92-ZXeLoCHu5wJL6L6HhNP7FkJ=meA@mail.gmail.com --- src/backend/main/main.c | 2 -- src/backend/utils/adt/pg_locale.c | 58 ------------------------------- src/backend/utils/init/postinit.c | 2 -- src/include/utils/pg_locale.h | 1 - 4 files changed, 63 deletions(-) diff --git a/src/backend/main/main.c b/src/backend/main/main.c index 43978fd359..ed11e8be7f 100644 --- a/src/backend/main/main.c +++ b/src/backend/main/main.c @@ -137,8 +137,6 @@ main(int argc, char *argv[]) */ unsetenv("LC_ALL"); - check_strxfrm_bug(); - /* * Catch standard options before doing much else, in particular before we * insist on not being root. diff --git a/src/backend/utils/adt/pg_locale.c b/src/backend/utils/adt/pg_locale.c index 092b620673..51df570ce9 100644 --- a/src/backend/utils/adt/pg_locale.c +++ b/src/backend/utils/adt/pg_locale.c @@ -1162,64 +1162,6 @@ IsoLocaleName(const char *winlocname) #endif /* WIN32 && LC_MESSAGES */ -/* - * Detect aging strxfrm() implementations that, in a subset of locales, write - * past the specified buffer length. Affected users must update OS packages - * before using PostgreSQL 9.5 or later. - * - * Assume that the bug can come and go from one postmaster startup to another - * due to physical replication among diverse machines. Assume that the bug's - * presence will not change during the life of a particular postmaster. Given - * those assumptions, call this no less than once per postmaster startup per - * LC_COLLATE setting used. No known-affected system offers strxfrm_l(), so - * there is no need to consider pg_collation locales. - */ -void -check_strxfrm_bug(void) -{ - char buf[32]; - const int canary = 0x7F; - bool ok = true; - - /* - * Given a two-byte ASCII string and length limit 7, 8 or 9, Solaris 10 - * 05/08 returns 18 and modifies 10 bytes. It respects limits above or - * below that range. - * - * The bug is present in Solaris 8 as well; it is absent in Solaris 10 - * 01/13 and Solaris 11.2. Affected locales include is_IS.ISO8859-1, - * en_US.UTF-8, en_US.ISO8859-1, and ru_RU.KOI8-R. Unaffected locales - * include de_DE.UTF-8, de_DE.ISO8859-1, zh_TW.UTF-8, and C. - */ - buf[7] = canary; - (void) strxfrm(buf, "ab", 7); - if (buf[7] != canary) - ok = false; - - /* - * illumos bug #1594 was present in the source tree from 2010-10-11 to - * 2012-02-01. Given an ASCII string of any length and length limit 1, - * affected systems ignore the length limit and modify a number of bytes - * one less than the return value. The problem inputs for this bug do not - * overlap those for the Solaris bug, hence a distinct test. - * - * Affected systems include smartos-20110926T021612Z. Affected locales - * include en_US.ISO8859-1 and en_US.UTF-8. Unaffected locales include C. - */ - buf[1] = canary; - (void) strxfrm(buf, "a", 1); - if (buf[1] != canary) - ok = false; - - if (!ok) - ereport(ERROR, - (errcode(ERRCODE_SYSTEM_ERROR), - errmsg_internal("strxfrm(), in locale \"%s\", writes past the specified array length", - setlocale(LC_COLLATE, NULL)), - errhint("Apply system library package updates."))); -} - - /* * Cache mechanism for collation information. * diff --git a/src/backend/utils/init/postinit.c b/src/backend/utils/init/postinit.c index 5af87a7868..53420f4974 100644 --- a/src/backend/utils/init/postinit.c +++ b/src/backend/utils/init/postinit.c @@ -487,8 +487,6 @@ CheckMyDatabase(const char *name, bool am_superuser, bool override_allow_connect SetConfigOption("lc_collate", collate, PGC_INTERNAL, PGC_S_DYNAMIC_DEFAULT); SetConfigOption("lc_ctype", ctype, PGC_INTERNAL, PGC_S_DYNAMIC_DEFAULT); - check_strxfrm_bug(); - ReleaseSysCache(tup); } diff --git a/src/include/utils/pg_locale.h b/src/include/utils/pg_locale.h index 8c095abc52..03ab598215 100644 --- a/src/include/utils/pg_locale.h +++ b/src/include/utils/pg_locale.h @@ -53,7 +53,6 @@ extern PGDLLIMPORT bool database_ctype_is_c; extern bool check_locale(int category, const char *locale, char **canonname); extern char *pg_perm_setlocale(int category, const char *locale); -extern void check_strxfrm_bug(void); extern bool lc_collate_is_c(Oid collation); extern bool lc_ctype_is_c(Oid collation);