do/require don't treat '.\foo' or '..\foo' as "absolute paths" on Windows.
authorChristoph Lamprecht <ch.l.ngre@online.de>
Mon, 11 May 2009 21:00:11 +0000 (14:00 -0700)
committerJan Dubois <jand@activestate.com>
Wed, 13 May 2009 21:32:28 +0000 (14:32 -0700)
commit36f064bc37569629cfa8ffed15497f849ae8ccfa
tree7edeef9832ea598cb5c3662d7283856cdd9e6c3c
parent56d86adf5b9b1c05ea2f24c084864c043d30d101
do/require don't treat '.\foo' or '..\foo' as "absolute paths" on Windows.

Both 'do' and 'require' treat paths *explicitly* relative to the
current directory (starting with './' or '../') as a special form of
absolute path.  That means they can be loaded directly and don't need
to be resolved via @INC, so they don't rely on '.' being in @INC
(unless running in taint mode). This behavior is "documented" in the P5P
thread "Coderefs in @INC" from 2002.

The code is missing special treatment of backslashes on Windows
so that '.\\' and '..\\' are handled in the same manner.

This change fixes

    http://rt.perl.org/rt3/Public/Bug/Display.html?id=63492

(Note that the references to taint mode in the bug report are only
relevant as far as taint mode removes '.' from @INC).

This change also fixes the following Scalar-List-Utils bug report:

    http://rt.cpan.org/Public/Bug/Display.html?id=25430

The Scalar::Util test failure in t/p_tainted.t only manifests itself
under Test::Harness 3, and only outside the Perl core:

* Test::Harness 2 (erroneously) puts '-I.' on the commandline in taint
  mode and runs something like this:

      `perl -I. t/p_tainted.t`

  so '.\t\tainted.t' can be found via '.' in @INC.

* Core Perl runs something like this from the t/ directory:

      `..\perl.exe -I../lib ../ext/List-Util/t/p_tainted.t`

  so '.\..\ext\List-Util\t\tained.t' can be found via '../lib' in @INC.

Signed-off-by: Jan Dubois <jand@activestate.com>
AUTHORS
pp_ctl.c
t/run/switcht.t