develooper Front page | perl.perl5.porters | Postings from December 2017

[perl #132648] Cwd: different return values between pure perl and XSvariants

Thread Next
From:
slaven @ rezic . de
Date:
December 23, 2017 20:32
Subject:
[perl #132648] Cwd: different return values between pure perl and XSvariants
Message ID:
rt-4.0.24-30911-1514061172-1730.132648-75-0@perl.org
# New Ticket Created by  slaven@rezic.de 
# Please include the string:  [perl #132648]
# in the subject line of all future correspondence about this issue. 
# <URL: https://rt.perl.org/Ticket/Display.html?id=132648 >



This is a bug report for perl from slaven@rezic.de,
generated with the help of perlbug 1.40 running under perl 5.26.1.


-----------------------------------------------------------------
The functions getcwd and abs_path return different values for the
XS and pure perl variants if a directory is non-existent. The XS
variant returns undef, while the PP variant returns an empty string.

A test program:

#!/usr/bin/perl

use strict;
use warnings;
use Test::More 'no_plan';
use File::Temp 'tempdir';
use Cwd 'getcwd', 'abs_path';

my $tmp = tempdir(CLEANUP => 1);
mkdir "$tmp/testdir" or die $!;
chdir "$tmp/testdir" or die $!;
rmdir "$tmp/testdir" or die $!;
is getcwd,	  undef, 'XS getcwd on non-existent directory';
is abs_path("."), undef, 'XS abs_path on non-existent directory';
{
    no warnings 'redefine';
    # force pure perl variants
    local *Cwd::abs_path = \&Cwd::_perl_abs_path;
    local *Cwd::getcwd	 = \&Cwd::_perl_getcwd;
    is Cwd::getcwd,	   undef, 'PP getcwd on non-existent directory';
    is Cwd::abs_path("."), undef, 'PP abs_path on non-existent directory';
}
chdir "/";

__END__

Output:

ok 1 - XS getcwd on non-existent directory
ok 2 - XS abs_path on non-existent directory
readdir(./..): No such file or directory at /tmp/cwd.pl line 20.
not ok 3 - PP getcwd on non-existent directory
#   Failed test 'PP getcwd on non-existent directory'
#   at /tmp/cwd.pl line 20.
#	   got: ''
#     expected: undef
readdir(./..): No such file or directory at /tmp/cwd.pl line 21.
not ok 4 - PP abs_path on non-existent directory
#   Failed test 'PP abs_path on non-existent directory'
#   at /tmp/cwd.pl line 21.
#	   got: ''
#     expected: undef
1..4
# Looks like you failed 2 tests of 4.


Additionally, the PP variants are quite loud while the XS variant is
silent in this situation. But this might be acceptable.

Probably the fix is to change all "return ''" statements in _perl_abs_path
to "return undef".

Regards,
    Slaven

-----------------------------------------------------------------
---
Flags:
    category=library
    severity=low
    module=Cwd
---
Site configuration information for perl 5.26.1:

Configured by eserte at Sat Sep 23 09:36:11 CEST 2017.

Summary of my perl5 (revision 5 version 26 subversion 1) configuration:
   
  Platform:
    osname=linux
    osvers=3.16.0-4-amd64
    archname=x86_64-linux
    uname='linux cabulja 3.16.0-4-amd64 #1 smp debian 3.16.39-1+deb8u2 (2017-03-07) x86_64 gnulinux '
    config_args='-ds -e -Dprefix=/opt/perl-5.26.1 -Dcf_email=srezic@cpan.org'
    hint=recommended
    useposix=true
    d_sigaction=define
    useithreads=undef
    usemultiplicity=undef
    use64bitint=define
    use64bitall=define
    uselongdouble=undef
    usemymalloc=n
    default_inc_excludes_dot=define
    bincompat5005=undef
  Compiler:
    cc='cc'
    ccflags ='-fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_FORTIFY_SOURCE=2'
    optimize='-O2'
    cppflags='-fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include'
    ccversion=''
    gccversion='4.9.2'
    gccosandvers=''
    intsize=4
    longsize=8
    ptrsize=8
    doublesize=8
    byteorder=12345678
    doublekind=3
    d_longlong=define
    longlongsize=8
    d_longdbl=define
    longdblsize=16
    longdblkind=3
    ivtype='long'
    ivsize=8
    nvtype='double'
    nvsize=8
    Off_t='off_t'
    lseeksize=8
    alignbytes=8
    prototype=define
  Linker and Libraries:
    ld='cc'
    ldflags =' -fstack-protector-strong -L/usr/local/lib'
    libpth=/usr/local/lib /usr/lib/gcc/x86_64-linux-gnu/4.9/include-fixed /usr/include/x86_64-linux-gnu /usr/lib /lib/x86_64-linux-gnu /lib/../lib /usr/lib/x86_64-linux-gnu /usr/lib/../lib /lib
    libs=-lpthread -lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lc -lgdbm_compat
    perllibs=-lpthread -lnsl -ldl -lm -lcrypt -lutil -lc
    libc=libc-2.19.so
    so=so
    useshrplib=false
    libperl=libperl.a
    gnulibc_version='2.19'
  Dynamic Linking:
    dlsrc=dl_dlopen.xs
    dlext=so
    d_dlsymun=undef
    ccdlflags='-Wl,-E'
    cccdlflags='-fPIC'
    lddlflags='-shared -O2 -L/usr/local/lib -fstack-protector-strong'


---
@INC for perl 5.26.1:
    /opt/perl-5.26.1/lib/site_perl/5.26.1/x86_64-linux
    /opt/perl-5.26.1/lib/site_perl/5.26.1
    /opt/perl-5.26.1/lib/5.26.1/x86_64-linux
    /opt/perl-5.26.1/lib/5.26.1

---
Environment for perl 5.26.1:
    HOME=/home/eserte
    LANG=en_US.UTF-8
    LANGUAGE (unset)
    LD_LIBRARY_PATH (unset)
    LOGDIR (unset)
    PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/eserte/bin/linux-gnu:/home/eserte/bin/sh:/home/eserte/bin:/home/eserte/bin/pistachio-perl/bin:/usr/games:/home/eserte/devel
    PERLDOC=-MPod::Perldoc::ToTextOverstrike
    PERL_BADLANG (unset)
    SHELL=/bin/zsh


Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About