On Fri, Aug 08, 2014 at 11:46:08AM +0200, Matthias Klose wrote:
> Control: reassign -1 libapache2-mod-perl2

> so 'sv' is declared inside the 'else' but you make its address escape
> through the 'svp' variable declared in the outer block.
> 
> Invalid.
> 
> A fix is to move the declaration of SV *sv up one block.

Many thanks! I can confirm the attached patch fixes the issue. 

Will forward this upstream and close #757240 with the fix.
-- 
Niko Tyni   [email protected]
>From 8c5e3984155dd3c32f627a0bfe0e9e67e7ed873a Mon Sep 17 00:00:00 2001
From: Niko Tyni <[email protected]>
Date: Sat, 9 Aug 2014 16:42:49 +0300
Subject: [PATCH] Fix invalid code that breaks with GCC 4.9 -ftree-dse
 optimization

This fixes SIGSEGVs at the start of the test suite when built with
GCC-4.9 at -O2 (which includes -ftree-dse).

Quoting Richard Biener in https://gcc.gnu.org/PR62035 :

> so 'sv' is declared inside the 'else' but you make its address escape
> through the 'svp' variable declared in the outer block.

Bug-Debian: http://bugs.debian.org/754901
---
 src/modules/perl/modperl_env.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/modules/perl/modperl_env.c b/src/modules/perl/modperl_env.c
index 769fd2c..c1a276b 100644
--- a/src/modules/perl/modperl_env.c
+++ b/src/modules/perl/modperl_env.c
@@ -37,12 +37,13 @@ static unsigned long modperl_interp_address(pTHX)
 #define MP_ENV_HV_STORE(hv, key, val) STMT_START {              \
         I32 klen = strlen(key);                                 \
         SV **svp = hv_fetch(hv, key, klen, FALSE);              \
+        SV *sv;                                                 \
                                                                 \
         if (svp) {                                              \
             sv_setpv(*svp, val);                                \
         }                                                       \
         else {                                                  \
-            SV *sv = newSVpv(val, 0);                           \
+            sv = newSVpv(val, 0);                               \
             (void)hv_store(hv, key, klen, sv, FALSE);           \
             modperl_envelem_tie(sv, key, klen);                 \
             svp = &sv;                                          \
-- 
2.1.0.rc1

Reply via email to