summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Peterson <benjamin@python.org>2016-09-14 05:43:45 (GMT)
committerBenjamin Peterson <benjamin@python.org>2016-09-14 05:43:45 (GMT)
commit59e5e0dca2af635ebe0098ef8c2673664e2bde59 (patch)
tree2be8ca20ac607ebf3ea0b1c4f71772907939809f
parent134192630a28d6ae6c2a256f95a44a2dd3c65388 (diff)
downloadcpython-59e5e0dca2af635ebe0098ef8c2673664e2bde59.zip
cpython-59e5e0dca2af635ebe0098ef8c2673664e2bde59.tar.gz
cpython-59e5e0dca2af635ebe0098ef8c2673664e2bde59.tar.bz2
improve type-safe of and prevent double-frees in get_locale_info (#28119)
-rw-r--r--Python/formatter_unicode.c26
1 files changed, 9 insertions, 17 deletions
diff --git a/Python/formatter_unicode.c b/Python/formatter_unicode.c
index e7c6a4f..617d58b 100644
--- a/Python/formatter_unicode.c
+++ b/Python/formatter_unicode.c
@@ -347,9 +347,11 @@ fill_padding(_PyUnicodeWriter *writer,
/************************************************************************/
/* Locale type codes. */
-#define LT_CURRENT_LOCALE 0
-#define LT_DEFAULT_LOCALE 1
-#define LT_NO_LOCALE 2
+enum LocaleType {
+ LT_CURRENT_LOCALE,
+ LT_DEFAULT_LOCALE,
+ LT_NO_LOCALE
+};
/* Locale info needed for formatting integers and the part of floats
before and including the decimal. Note that locales only support
@@ -663,7 +665,7 @@ static char no_grouping[1] = {CHAR_MAX};
LT_CURRENT_LOCALE, a hard-coded locale if LT_DEFAULT_LOCALE, or
none if LT_NO_LOCALE. */
static int
-get_locale_info(int type, LocaleInfo *locale_info)
+get_locale_info(enum LocaleType type, LocaleInfo *locale_info)
{
switch (type) {
case LT_CURRENT_LOCALE: {
@@ -676,21 +678,16 @@ get_locale_info(int type, LocaleInfo *locale_info)
locale_info->thousands_sep = PyUnicode_DecodeLocale(
locale_data->thousands_sep,
NULL);
- if (locale_info->thousands_sep == NULL) {
- Py_DECREF(locale_info->decimal_point);
+ if (locale_info->thousands_sep == NULL)
return -1;
- }
locale_info->grouping = locale_data->grouping;
break;
}
case LT_DEFAULT_LOCALE:
locale_info->decimal_point = PyUnicode_FromOrdinal('.');
locale_info->thousands_sep = PyUnicode_FromOrdinal(',');
- if (!locale_info->decimal_point || !locale_info->thousands_sep) {
- Py_XDECREF(locale_info->decimal_point);
- Py_XDECREF(locale_info->thousands_sep);
+ if (!locale_info->decimal_point || !locale_info->thousands_sep)
return -1;
- }
locale_info->grouping = "\3"; /* Group every 3 characters. The
(implicit) trailing 0 means repeat
infinitely. */
@@ -698,15 +695,10 @@ get_locale_info(int type, LocaleInfo *locale_info)
case LT_NO_LOCALE:
locale_info->decimal_point = PyUnicode_FromOrdinal('.');
locale_info->thousands_sep = PyUnicode_New(0, 0);
- if (!locale_info->decimal_point || !locale_info->thousands_sep) {
- Py_XDECREF(locale_info->decimal_point);
- Py_XDECREF(locale_info->thousands_sep);
+ if (!locale_info->decimal_point || !locale_info->thousands_sep)
return -1;
- }
locale_info->grouping = no_grouping;
break;
- default:
- assert(0);
}
return 0;
}