summaryrefslogtreecommitdiff
path: root/src/backend/utils/adt
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/utils/adt')
-rw-r--r--src/backend/utils/adt/pg_locale.c23
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 1c57f12695e..cd5ad1e7056 100644
--- a/src/backend/utils/adt/pg_locale.c
+++ b/src/backend/utils/adt/pg_locale.c
@@ -56,6 +56,7 @@
#include "access/htup_details.h"
#include "catalog/pg_collation.h"
+#include "common/string.h"
#include "mb/pg_wchar.h"
#include "miscadmin.h"
#include "utils/builtins.h"
@@ -317,6 +318,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 */
@@ -339,6 +350,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);
}