소스 검색

fix localeconv values and implementation

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..
Rich Felker 13 년 전
부모
커밋
85a3ba3a28
1개의 변경된 파일28개의 추가작업 그리고 15개의 파일을 삭제
  1. 28 15
      src/locale/localeconv.c

+ 28 - 15
src/locale/localeconv.c

@@ -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;
 }