This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
add va_end() calls where missing for a va_start() or va_end().
authorJarkko Hietaniemi <jhi@iki.fi>
Wed, 23 Apr 2014 16:53:42 +0000 (12:53 -0400)
committerTony Cook <tony@develop-help.com>
Thu, 29 May 2014 06:20:18 +0000 (16:20 +1000)
Fix for Coverity perl5 CIDs 29225, 29226, 29227, 29228, 29229: Missing
varargs init or cleanup (VARARGS) missing va_end: va_end was not
called for foo.

Use of va_args must be finished off with va_end (in other words,
use of va_start or va_copy must be bracketed off with va_end).
In most platforms va_end is a no-op, but in some platforms it is
required for proper cleanup (or face stack smash, or memory leak).

Tony: move va_start() out of the declaration block

ext/PerlIO-via/via.xs
mathoms.c
perlio.c
util.c

index 619174a..d7a037b 100644 (file)
@@ -68,15 +68,16 @@ PerlIOVia_method(pTHX_ PerlIO * f, const char *method, CV ** save, int flags,
                 ...)
 {
     PerlIOVia *s = PerlIOSelf(f, PerlIOVia);
+    SV *result = Nullsv;
     CV *cv =
        (*save) ? *save : PerlIOVia_fetchmethod(aTHX_ s, method, save);
-    SV *result = Nullsv;
-    va_list ap;
-    va_start(ap, flags);
     if (cv != (CV *) - 1) {
        IV count;
        dSP;
        SV *arg;
+        va_list ap;
+
+        va_start(ap, flags);
        PUSHSTACKi(PERLSI_MAGIC);
        ENTER;
        PUSHMARK(sp);
@@ -84,6 +85,7 @@ PerlIOVia_method(pTHX_ PerlIO * f, const char *method, CV ** save, int flags,
        while ((arg = va_arg(ap, SV *))) {
            XPUSHs(arg);
        }
+        va_end(ap);
        if (*PerlIONext(f)) {
            if (!s->fh) {
                GV *gv;
@@ -121,7 +123,6 @@ PerlIOVia_method(pTHX_ PerlIO * f, const char *method, CV ** save, int flags,
        LEAVE;
        POPSTACK;
     }
-    va_end(ap);
     return result;
 }
 
index 73f1e8d..1132ac8 100644 (file)
--- a/mathoms.c
+++ b/mathoms.c
@@ -544,6 +544,7 @@ int
 Perl_fprintf_nocontext(PerlIO *stream, const char *format, ...)
 {
     dTHXs;
+    int ret = 0;
     va_list(arglist);
 
     /* Easier to special case this here than in embed.pl. (Look at what it
@@ -553,7 +554,9 @@ Perl_fprintf_nocontext(PerlIO *stream, const char *format, ...)
 #endif
 
     va_start(arglist, format);
-    return PerlIO_vprintf(stream, format, arglist);
+    ret = PerlIO_vprintf(stream, format, arglist);
+    va_end(arglist);
+    return ret;
 }
 
 int
@@ -561,13 +564,16 @@ Perl_printf_nocontext(const char *format, ...)
 {
     dTHX;
     va_list(arglist);
+    int ret = 0;
 
 #ifdef PERL_IMPLICIT_CONTEXT
     PERL_ARGS_ASSERT_PRINTF_NOCONTEXT;
 #endif
 
     va_start(arglist, format);
-    return PerlIO_vprintf(PerlIO_stdout(), format, arglist);
+    ret = PerlIO_vprintf(PerlIO_stdout(), format, arglist);
+    va_end(arglist);
+    return ret;
 }
 
 #if defined(HUGE_VAL) || (defined(USE_LONG_DOUBLE) && defined(HUGE_VALL))
index 03c6513..89b8ee6 100644 (file)
--- a/perlio.c
+++ b/perlio.c
@@ -4919,6 +4919,7 @@ PerlIO_vprintf(PerlIO *f, const char *fmt, va_list ap)
     s = SvPV_const(sv, len);
     wrote = PerlIO_write(f, s, len);
     SvREFCNT_dec(sv);
+    va_end(apc);
     return wrote;
 }
 
diff --git a/util.c b/util.c
index b90abe5..4daf01d 100644 (file)
--- a/util.c
+++ b/util.c
@@ -4935,6 +4935,7 @@ Perl_my_vsnprintf(char *buffer, const Size_t len, const char *format, va_list ap
     retval = vsprintf(buffer, format, ap);
 # endif
 #endif /* #ifdef NEED_VA_COPY */
+    va_end(apc);
     /* vsprintf() shows failure with < 0 */
     if (retval < 0
 #ifdef HAS_VSNPRINTF