diff options
Diffstat (limited to 'src/backend')
-rw-r--r-- | src/backend/utils/adt/pg_locale.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/src/backend/utils/adt/pg_locale.c b/src/backend/utils/adt/pg_locale.c index f2a28d5ef5a..b4954959f98 100644 --- a/src/backend/utils/adt/pg_locale.c +++ b/src/backend/utils/adt/pg_locale.c @@ -58,6 +58,7 @@ #include "catalog/pg_collation.h" #include "catalog/pg_database.h" #include "common/hashfn.h" +#include "common/string.h" #include "mb/pg_wchar.h" #include "miscadmin.h" #include "utils/builtins.h" @@ -341,6 +342,16 @@ check_locale(int category, const char *locale, char **canonname) char *save; char *res; + /* Don't let Windows' non-ASCII locale names in. */ + if (!pg_is_ascii(locale)) + { + ereport(WARNING, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("locale name \"%s\" contains non-ASCII characters", + locale))); + return false; + } + if (canonname) *canonname = NULL; /* in case of failure */ @@ -363,6 +374,18 @@ check_locale(int category, const char *locale, char **canonname) elog(WARNING, "failed to restore old locale \"%s\"", save); pfree(save); + /* Don't let Windows' non-ASCII locale names out. */ + if (canonname && *canonname && !pg_is_ascii(*canonname)) + { + ereport(WARNING, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("locale name \"%s\" contains non-ASCII characters", + *canonname))); + pfree(*canonname); + *canonname = NULL; + return false; + } + return (res != NULL); } |