summaryrefslogtreecommitdiff
path: root/pp_hot.c
diff options
context:
space:
mode:
authorFather Chrysostomos <sprout@cpan.org>2011-12-24 07:05:42 -0800
committerFather Chrysostomos <sprout@cpan.org>2011-12-24 16:14:31 -0800
commit746f6409435f8adf48a22fa3c61d95758160b655 (patch)
tree2e01962418518b71f6d2a56e7a5fc25a2662a944 /pp_hot.c
parent3f4d1d7873e4e02f3801f2982565de93d2127bbd (diff)
downloadperl-746f6409435f8adf48a22fa3c61d95758160b655.tar.gz
Don’t crash when writing to null hash elem
It’s possible for XS code to create hash entries with null values. pp_helem and pp_slice were not taking that into account. In fact, the core produces such hash entries, but they are rarely visible from Perl. It’s good to check for them anyway.
Diffstat (limited to 'pp_hot.c')
-rw-r--r--pp_hot.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/pp_hot.c b/pp_hot.c
index a2d6f9140e..99cd2e199a 100644
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -1773,7 +1773,7 @@ PP(pp_helem)
he = hv_fetch_ent(hv, keysv, lval && !defer, hash);
svp = he ? &HeVAL(he) : NULL;
if (lval) {
- if (!svp || *svp == &PL_sv_undef) {
+ if (!svp || !*svp || *svp == &PL_sv_undef) {
SV* lv;
SV* key2;
if (!defer) {
@@ -1803,7 +1803,7 @@ PP(pp_helem)
RETURN;
}
}
- sv = (svp ? *svp : &PL_sv_undef);
+ sv = (svp && *svp ? *svp : &PL_sv_undef);
/* Originally this did a conditional C<sv = sv_mortalcopy(sv)>; this
* was to make C<local $tied{foo} = $tied{foo}> possible.
* However, it seems no longer to be needed for that purpose, and