don't check format args on taint_proper
authorDavid Mitchell <davem@iabyn.com>
Sun, 1 Dec 2013 11:16:52 +0000 (11:16 +0000)
committerDavid Mitchell <davem@iabyn.com>
Sun, 1 Dec 2013 11:16:52 +0000 (11:16 +0000)
My recent commit 5d37acd6b65eb enabled (among other things)
format-arg checking of taint_proper(). This was not a good idea since
taint_proper() adds extra args before it actually calls a printf-style
function. This was masked since on some gcc systems, a NULLOK format arg
disables this check.

embed.fnc
proto.h
taint.c

index c0fd92d..422f6d1 100644 (file)
--- a/embed.fnc
+++ b/embed.fnc
@@ -1502,7 +1502,7 @@ EXMp      |void   |_invlist_dump  |NN PerlIO *file|I32 level   \
                                |NN SV* const invlist
 #endif
 Ap     |void   |taint_env
-Afp    |void   |taint_proper   |NULLOK const char* f|NN const char *const s
+Ap     |void   |taint_proper   |NULLOK const char* f|NN const char *const s
 Apd    |UV     |to_utf8_case   |NN const U8 *p|NN U8* ustrp|NULLOK STRLEN *lenp \
                                |NN SV **swashp|NN const char *normal|NULLOK const char *special
 Abmd   |UV     |to_utf8_lower  |NN const U8 *p|NN U8* ustrp|NULLOK STRLEN *lenp
diff --git a/proto.h b/proto.h
index 83a99e1..221d14a 100644 (file)
--- a/proto.h
+++ b/proto.h
@@ -4647,7 +4647,6 @@ PERL_CALLCONV void        Perl_sys_init3(int* argc, char*** argv, char*** env)
 PERL_CALLCONV void     Perl_sys_term(void);
 PERL_CALLCONV void     Perl_taint_env(pTHX);
 PERL_CALLCONV void     Perl_taint_proper(pTHX_ const char* f, const char *const s)
-                       __attribute__format__null_ok__(__printf__,pTHX_1,0)
                        __attribute__nonnull__(pTHX_2);
 #define PERL_ARGS_ASSERT_TAINT_PROPER  \
        assert(s)
diff --git a/taint.c b/taint.c
index 63f0dfc..3fc6250 100644 (file)
--- a/taint.c
+++ b/taint.c
@@ -55,7 +55,10 @@ Perl_taint_proper(pTHX_ const char *f, const char *const s)
         else
            ug = " while running with -T switch";
 
-        GCC_DIAG_IGNORE(-Wformat-nonliteral); /* fmt checked by caller */
+        /* XXX because taint_proper adds extra format args, we can't
+         * get the caller to check properly; o we just silence the warning
+         * and hope the callers aren't naughty */
+        GCC_DIAG_IGNORE(-Wformat-nonliteral);
        if (PL_unsafe || TAINT_WARN_get) {
            Perl_ck_warner_d(aTHX_ packWARN(WARN_TAINT), f, s, ug);
         }