diff options
author | Tony Cook <tony@develop-help.com> | 2014-03-26 14:31:57 +1100 |
---|---|---|
committer | Tony Cook <tony@develop-help.com> | 2014-03-26 14:31:57 +1100 |
commit | e14119056960dbe28537c9870667b5b920d9d731 (patch) | |
tree | d16dd5694afcc5e446897093dcc6b8b589b2ca53 /sv.c | |
parent | a8509e91bb215baa6f3e9592e6f68e4407f89168 (diff) | |
download | perl-e14119056960dbe28537c9870667b5b920d9d731.tar.gz |
[perl #121366] avoid using an invalid SvPVX() in Perl_sv_pvn_force_flags
This would cause valgrind to complain about:
vec($Foo, 0, 1) = 1; # for example
when $Foo was undef, since SvPVX()[1] isn't initialized until the SV is
at least a SVt_PV.
[1] well, sv_u.svu_rv, but sv_u is a union, so the same memory is
initialized. This isn't technically legal from a C point of view,
but pointer types are compatible enough with each other for it to not
be an issue.
Diffstat (limited to 'sv.c')
-rw-r--r-- | sv.c | 3 |
1 files changed, 2 insertions, 1 deletions
@@ -9502,7 +9502,8 @@ Perl_sv_pvn_force_flags(pTHX_ SV *const sv, STRLEN *const lp, const I32 flags) if (lp) *lp = len; - if (s != SvPVX_const(sv)) { /* Almost, but not quite, sv_setpvn() */ + if (SvTYPE(sv) < SVt_PV || + s != SvPVX_const(sv)) { /* Almost, but not quite, sv_setpvn() */ if (SvROK(sv)) sv_unref(sv); SvUPGRADE(sv, SVt_PV); /* Never FALSE */ |