Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend')
-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 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);
}