summaryrefslogtreecommitdiff
path: root/mg.c
diff options
context:
space:
mode:
authorFelipe Gasper <felipe@felipegasper.com>2021-04-09 23:08:39 -0400
committerKarl Williamson <khw@cpan.org>2021-04-16 17:11:31 -0600
commit50352f1687ab2f02685a380668c889111cdeeee9 (patch)
tree394c42dc6affad5d3729a7f58b694f3e2d67f243 /mg.c
parent3e22b590c6d72471558aaf41940c266859f988b8 (diff)
downloadperl-50352f1687ab2f02685a380668c889111cdeeee9.tar.gz
Set %ENV keys using the same byte-string logic as setting %ENV values.
Issue #18636: This extends the work from 613c63b465f01af4e535fdc6c1c17e7470be5aad to %ENV keys. Previously if you assigned an upgraded string as a key in %ENV, the string’s internal PV representation was sent to the OS. Now the string is “soft downgraded” before being given to the OS; if the downgrade fails--i.e., if the string contains code points above 255--then a warning is printed, and the string’s utf8 is assigned to the environment, as happens with %ENV values. A new internal macro, MgSV, is created to facilitate this work.
Diffstat (limited to 'mg.c')
-rw-r--r--mg.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/mg.c b/mg.c
index b1a036ef7b..3355df1b4b 100644
--- a/mg.c
+++ b/mg.c
@@ -1269,9 +1269,24 @@ int
Perl_magic_setenv(pTHX_ SV *sv, MAGIC *mg)
{
STRLEN len = 0, klen;
- const char * const key = MgPV_const(mg,klen);
+
+ const char *key;
const char *s = "";
+ SV *keysv = MgSV(mg);
+
+ if (keysv == NULL) {
+ key = mg->mg_ptr;
+ klen = mg->mg_len;
+ }
+ else {
+ if (!sv_utf8_downgrade(keysv, /* fail_ok */ TRUE)) {
+ Perl_ck_warner_d(aTHX_ packWARN(WARN_UTF8), "Wide character in %s", "setenv key (encoding to utf8)");
+ }
+
+ key = SvPV_const(keysv,klen);
+ }
+
PERL_ARGS_ASSERT_MAGIC_SETENV;
SvGETMAGIC(sv);