fix localeconv values and implementation
authorRich Felker <dalias@aerifal.cx>
Wed, 20 Jun 2012 02:44:08 +0000 (22:44 -0400)
committerRich Felker <dalias@aerifal.cx>
Wed, 20 Jun 2012 02:44:08 +0000 (22:44 -0400)
dynamic-allocation of the structure is not valid; it can crash an
application if malloc fails. since localeconv is not specified to have
failure conditions, the object needs to have static storage duration.

need to review whether all the values are right or not still..

src/locale/localeconv.c

index d79d1c07d5923aaafd602732e4574e10e6818ea0..494cbcc0a822b20535e00f24e64e3b6c790ed2bc 100644 (file)
@@ -2,21 +2,34 @@
 #include <string.h>
 #include <stdlib.h>
 
+static const struct lconv posix_lconv = {
+       .decimal_point = ".",
+       .thousands_sep = "",
+       .grouping = "",
+       .int_curr_symbol = "",
+       .currency_symbol = "",
+       .mon_decimal_point = "",
+       .mon_thousands_sep = "",
+       .mon_grouping = "",
+       .positive_sign = "",
+       .negative_sign = "",
+       .int_frac_digits = -1,
+       .frac_digits = -1,
+       .p_cs_precedes = -1,
+       .p_sep_by_space = -1,
+       .n_cs_precedes = -1,
+       .n_sep_by_space = -1,
+       .p_sign_posn = -1,
+       .n_sign_posn = -1,
+       .int_p_cs_precedes = -1,
+       .int_p_sep_by_space = -1,
+       .int_n_cs_precedes = -1,
+       .int_n_sep_by_space = -1,
+       .int_p_sign_posn = -1,
+       .int_n_sign_posn = -1,
+};
+
 struct lconv *localeconv(void)
 {
-       static struct lconv *posix_lconv;
-       if (posix_lconv) return posix_lconv;
-       posix_lconv = malloc(sizeof *posix_lconv);
-       memset(posix_lconv, -1, sizeof *posix_lconv);
-       posix_lconv->decimal_point = ".";
-       posix_lconv->thousands_sep = "";
-       posix_lconv->grouping = "\xff";
-       posix_lconv->int_curr_symbol = ""; //"\xc2\xa4";
-       posix_lconv->currency_symbol = "";
-       posix_lconv->mon_decimal_point = "";
-       posix_lconv->mon_thousands_sep = "";
-       posix_lconv->mon_grouping = "\xff";
-       posix_lconv->positive_sign = ""; // "+";
-       posix_lconv->negative_sign = ""; // "-";
-       return posix_lconv;
+       return (void *)&posix_lconv;
 }