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);