More admonishment that one shouldn't waste one's efforts
[p5sagit/p5-mst-13.2.git] / pp_sys.c
index c199cf7..2639fe9 100644 (file)
--- a/pp_sys.c
+++ b/pp_sys.c
@@ -828,11 +828,11 @@ PP(pp_tie)
        sv_unmagic(varsv, how);
        /* Croak if a self-tie on an aggregate is attempted. */
        if (varsv == SvRV(sv) &&
-           (SvTYPE(sv) == SVt_PVAV ||
-            SvTYPE(sv) == SVt_PVHV))
+           (SvTYPE(varsv) == SVt_PVAV ||
+            SvTYPE(varsv) == SVt_PVHV))
            Perl_croak(aTHX_
                       "Self-ties of arrays and hashes are not supported");
-       sv_magic(varsv, sv, how, Nullch, 0);
+       sv_magic(varsv, (SvRV(sv) == varsv ? Nullsv : sv), how, Nullch, 0);
     }
     LEAVE;
     SP = PL_stack_base + markoff;
@@ -4049,18 +4049,21 @@ PP(pp_system)
     I32 did_pipes = 0;
 
     if (PL_tainting) {
+       int some_arg_tainted = 0;
        TAINT_ENV();
        while (++MARK <= SP) {
            (void)SvPV_nolen(*MARK);      /* stringify for taint check */
-           if (PL_tainted)
+           if (PL_tainted) {
+               some_arg_tainted = 1;
                break;
+           }
        }
        MARK = ORIGMARK;
        /* XXX Remove warning at end of deprecation cycle --RD 2002-02  */
        if (SP - MARK == 1) {
            TAINT_PROPER("system");
        }
-       else if (ckWARN2(WARN_TAINT, WARN_DEPRECATED)) {
+       else if (some_arg_tainted && ckWARN2(WARN_TAINT, WARN_DEPRECATED)) {
            Perl_warner(aTHX_ packWARN2(WARN_TAINT, WARN_DEPRECATED),
                "Use of tainted arguments in %s is deprecated", "system");
        }
@@ -4175,18 +4178,21 @@ PP(pp_exec)
     STRLEN n_a;
 
     if (PL_tainting) {
+       int some_arg_tainted = 0;
        TAINT_ENV();
        while (++MARK <= SP) {
            (void)SvPV_nolen(*MARK);      /* stringify for taint check */
-           if (PL_tainted)
+           if (PL_tainted) {
+               some_arg_tainted = 1;
                break;
+           }
        }
        MARK = ORIGMARK;
        /* XXX Remove warning at end of deprecation cycle --RD 2002-02  */
        if (SP - MARK == 1) {
            TAINT_PROPER("exec");
        }
-       else if (ckWARN2(WARN_TAINT, WARN_DEPRECATED)) {
+       else if (some_arg_tainted && ckWARN2(WARN_TAINT, WARN_DEPRECATED)) {
            Perl_warner(aTHX_ packWARN2(WARN_TAINT, WARN_DEPRECATED),
                "Use of tainted arguments in %s is deprecated", "exec");
        }
@@ -5212,6 +5218,9 @@ PP(pp_gpwent)
     case OP_GPWENT:
 #   ifdef HAS_GETPWENT
        pwent  = getpwent();
+#ifdef POSIX_BC   /* In some cases pw_passwd has invalid addresses */
+       if (pwent) pwent = getpwnam(pwent->pw_name);
+#endif
 #   else
        DIE(aTHX_ PL_no_func, "getpwent");
 #   endif