From 41c363a3154dd1caeb431fa54748ad48ef6d3bd1 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Thu, 2 Aug 2018 21:46:51 +0200 Subject: patch 8.1.0234: incorrect reference counting in Perl interface Problem: Incorrect reference counting in Perl interface. Solution: Call SvREFCNT_inc more often, add a test. (Damien) --- src/if_perl.xs | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) (limited to 'src/if_perl.xs') diff --git a/src/if_perl.xs b/src/if_perl.xs index bc15efa944..9fd219691e 100644 --- a/src/if_perl.xs +++ b/src/if_perl.xs @@ -831,8 +831,7 @@ newWINrv(SV *rv, win_T *ptr) ptr->w_perl_private = newSV(0); sv_setiv(ptr->w_perl_private, PTR2IV(ptr)); } - else - SvREFCNT_inc_void_NN(ptr->w_perl_private); + SvREFCNT_inc_void_NN(ptr->w_perl_private); SvRV(rv) = ptr->w_perl_private; SvROK_on(rv); return sv_bless(rv, gv_stashpv("VIWIN", TRUE)); @@ -847,8 +846,7 @@ newBUFrv(SV *rv, buf_T *ptr) ptr->b_perl_private = newSV(0); sv_setiv(ptr->b_perl_private, PTR2IV(ptr)); } - else - SvREFCNT_inc_void_NN(ptr->b_perl_private); + SvREFCNT_inc_void_NN(ptr->b_perl_private); SvRV(rv) = ptr->b_perl_private; SvROK_on(rv); return sv_bless(rv, gv_stashpv("VIBUF", TRUE)); @@ -918,12 +916,13 @@ I32 cur_val(IV iv, SV *sv) else rv = newBUFrv(newSV(0), curbuf); - if (SvRV(sv) == SvRV(rv)) - SvREFCNT_dec(SvRV(rv)); - else // XXX: Not sure if the `else` condition are right - // Test_SvREFCNT() pass in all case. + if (SvRV(sv) != SvRV(rv)) + // XXX: This magic variable is a bit confusing... + // Is curently refcounted ? sv_setsv(sv, rv); + SvREFCNT_dec(rv); + return 0; } #endif /* !PROTO */ -- cgit v1.2.3