diff --git a/src/bin/psql/print.c b/src/bin/psql/print.c index ecf1137838..725ce8b34c 100644 --- a/src/bin/psql/print.c +++ b/src/bin/psql/print.c @@ -3227,16 +3227,24 @@ setDecimalLocale(void) extlconv = localeconv(); + /* Don't accept an empty decimal_point string */ if (*extlconv->decimal_point) decimal_point = pg_strdup(extlconv->decimal_point); else decimal_point = "."; /* SQL output standard */ - if (*extlconv->grouping && atoi(extlconv->grouping) > 0) - groupdigits = atoi(extlconv->grouping); - else + /* + * Although the Open Group standard allows locales to supply more than one + * group width, we consider only the first one, and we ignore any attempt + * to suppress grouping by specifying CHAR_MAX. As in the backend's + * cash.c, we must apply a range check to avoid being fooled by variant + * CHAR_MAX values. + */ + groupdigits = *extlconv->grouping; + if (groupdigits <= 0 || groupdigits > 6) groupdigits = 3; /* most common */ + /* Don't accept an empty thousands_sep string, either */ /* similar code exists in formatting.c */ if (*extlconv->thousands_sep) thousands_sep = pg_strdup(extlconv->thousands_sep);