summaryrefslogtreecommitdiff
path: root/util.c
diff options
context:
space:
mode:
authorAlan Burlison <Alan.Burlison@uk.sun.com>2000-09-13 17:27:37 +0100
committerJarkko Hietaniemi <jhi@iki.fi>2000-09-14 14:20:36 +0000
commitf41820981f84708ef067a8bea41c79da755543c1 (patch)
treeaf026bff820cd6fe5a12b3a1c9a25dd1192075e9 /util.c
parent383e7cdd17eec132ddb7b17dd6275f3153cbe989 (diff)
downloadperl-f41820981f84708ef067a8bea41c79da755543c1.tar.gz
The return value of setlocale must be copied away.
Subject: [ID 20000913.001] Heap corruption in Perl_init_i18nl10n Message-Id: <39BF9CE9.3D7FBBDD@uk.sun.com> p4raw-id: //depot/perl@7070
Diffstat (limited to 'util.c')
-rw-r--r--util.c32
1 files changed, 29 insertions, 3 deletions
diff --git a/util.c b/util.c
index ea0778f801..6123321d28 100644
--- a/util.c
+++ b/util.c
@@ -659,6 +659,8 @@ Perl_init_i18nl10n(pTHX_ int printwarn)
(!done && (lang || PerlEnv_getenv("LC_CTYPE")))
? "" : Nullch)))
setlocale_failure = TRUE;
+ else
+ curctype = savepv(curctype);
#endif /* USE_LOCALE_CTYPE */
#ifdef USE_LOCALE_COLLATE
if (! (curcoll =
@@ -666,6 +668,8 @@ Perl_init_i18nl10n(pTHX_ int printwarn)
(!done && (lang || PerlEnv_getenv("LC_COLLATE")))
? "" : Nullch)))
setlocale_failure = TRUE;
+ else
+ curcoll = savepv(curcoll);
#endif /* USE_LOCALE_COLLATE */
#ifdef USE_LOCALE_NUMERIC
if (! (curnum =
@@ -673,6 +677,8 @@ Perl_init_i18nl10n(pTHX_ int printwarn)
(!done && (lang || PerlEnv_getenv("LC_NUMERIC")))
? "" : Nullch)))
setlocale_failure = TRUE;
+ else
+ curnum = savepv(curnum);
#endif /* USE_LOCALE_NUMERIC */
}
@@ -689,14 +695,20 @@ Perl_init_i18nl10n(pTHX_ int printwarn)
#ifdef USE_LOCALE_CTYPE
if (! (curctype = setlocale(LC_CTYPE, "")))
setlocale_failure = TRUE;
+ else
+ curctype = savepv(curctype);
#endif /* USE_LOCALE_CTYPE */
#ifdef USE_LOCALE_COLLATE
if (! (curcoll = setlocale(LC_COLLATE, "")))
setlocale_failure = TRUE;
+ else
+ curcoll = savepv(curcoll);
#endif /* USE_LOCALE_COLLATE */
#ifdef USE_LOCALE_NUMERIC
if (! (curnum = setlocale(LC_NUMERIC, "")))
setlocale_failure = TRUE;
+ else
+ curnum = savepv(curnum);
#endif /* USE_LOCALE_NUMERIC */
}
@@ -808,15 +820,16 @@ Perl_init_i18nl10n(pTHX_ int printwarn)
#endif /* ! LC_ALL */
#ifdef USE_LOCALE_CTYPE
- curctype = setlocale(LC_CTYPE, Nullch);
+ curctype = savepv(setlocale(LC_CTYPE, Nullch));
#endif /* USE_LOCALE_CTYPE */
#ifdef USE_LOCALE_COLLATE
- curcoll = setlocale(LC_COLLATE, Nullch);
+ curcoll = savepv(setlocale(LC_COLLATE, Nullch));
#endif /* USE_LOCALE_COLLATE */
#ifdef USE_LOCALE_NUMERIC
- curnum = setlocale(LC_NUMERIC, Nullch);
+ curnum = savepv(setlocale(LC_NUMERIC, Nullch));
#endif /* USE_LOCALE_NUMERIC */
}
+ else {
#ifdef USE_LOCALE_CTYPE
new_ctype(curctype);
@@ -829,9 +842,22 @@ Perl_init_i18nl10n(pTHX_ int printwarn)
#ifdef USE_LOCALE_NUMERIC
new_numeric(curnum);
#endif /* USE_LOCALE_NUMERIC */
+ }
#endif /* USE_LOCALE */
+#ifdef USE_LOCALE_CTYPE
+ if (curctype != NULL)
+ Safefree(curctype);
+#endif /* USE_LOCALE_CTYPE */
+#ifdef USE_LOCALE_COLLATE
+ if (curcoll != NULL)
+ Safefree(curcoll);
+#endif /* USE_LOCALE_COLLATE */
+#ifdef USE_LOCALE_NUMERIC
+ if (curnum != NULL)
+ Safefree(curnum);
+#endif /* USE_LOCALE_NUMERIC */
return ok;
}