develooper Front page | perl.perl5.porters | Postings from July 2014

[perl #122224] smoke-me/leont/perlio-win32 branch

Thread Previous | Thread Next
From:
bulk88
Date:
July 4, 2014 00:21
Subject:
[perl #122224] smoke-me/leont/perlio-win32 branch
Message ID:
rt-4.0.18-12422-1404433291-1152.122224-75-0@perl.org
# New Ticket Created by  bulk88 
# Please include the string:  [perl #122224]
# in the subject line of all future correspondence about this issue. 
# <URL: https://rt.perl.org/Ticket/Display.html?id=122224 >


This is a bug report for perl from bulk88@hotmail.com,
generated with the help of perlbug 1.40 running under perl 5.21.1.


-----------------------------------------------------------------
[Please describe your issue here]

After some offline discussion with leont, he created 
http://perl5.git.perl.org/perl.git/shortlog/refs/heads/smoke-me/leont/perlio-win32 
. The change

-------------------------------------------------------------
--- a/win32/win32io.c
+++ b/win32/win32io.c
@@ -323,7 +323,7 @@ PerlIOWin32_dup(pTHX_ PerlIO *f, PerlIO *o, 
CLONE_PARAMS *params, int flags)
  PerlIOWin32 *os = PerlIOSelf(f,PerlIOWin32);
  HANDLE proc = GetCurrentProcess();
  HANDLE new_h;
- if (DuplicateHandle(proc, os->h, proc, &new_h, 0, FALSE,  
DUPLICATE_SAME_ACCESS))
+ if (DuplicateHandle(proc, os->h, proc, &new_h, 0, TRUE,  
DUPLICATE_SAME_ACCESS))
   {
    char mode[8];
    int fd = win32_open_osfhandle((intptr_t) new_h, 
PerlIOUnix_oflags(PerlIO_modestr(o,mode)));

-------------------------------------------------------------

reflects correcting PerlIOWin32_dup to MS CRT's implementation of dup. 
Obviously we want the handle to exist in a child process 
(system/backticks/open).

But this branch SEGVs. Callstack

-------------------------------------------------------------

	perl521.dll!PerlIOWin32_dup(interpreter * my_perl=0x00364dbc, _PerlIO * * f=0x008f62cc, _PerlIO * * o=0x008f677c, clone_params * params=0x00000000, int flags=2)  Line 326 + 0xb	C
 	perl521.dll!PerlIOBase_dup(interpreter * my_perl=0x00364dbc, _PerlIO * * f=0x008f62cc, _PerlIO * * o=0x008f627c, clone_params * param=0x00000000, int flags=2)  Line 2207	C
 	perl521.dll!PerlIO_fdupopen(interpreter * my_perl=0x0012fbb0, _PerlIO * * f=0x00070023, clone_params * param=0x00000000, int flags=2)  Line 506 + 0x13	C
 	perl521.dll!Perl_do_open6(interpreter * my_perl=0x00364dbc, gv * gv=0x00e6de6c, const char * oname=0x00ebc87c, unsigned int len=3, _PerlIO * * supplied_fp=0x00000000, sv * * svp=0x00f9d4f4, unsigned long num_svs=0)  Line 443 + 0x10	C
 	perl521.dll!Perl_pp_open(interpreter * my_perl=0x00364dbc)  Line 638	C
 	perl521.dll!Perl_runops_standard(interpreter * my_perl=0x00364dbc)  Line 41 + 0x4	C
 	perl521.dll!S_run_body(interpreter * my_perl=0x008f62cc, long oldscope=1)  Line 2408 + 0xa	C
 	perl521.dll!perl_run(interpreter * my_perl=0x00364dbc)  Line 2331 + 0x8	C
 	perl521.dll!RunPerl(int argc=3, char * * argv=0x01364d58, char * * env=0x00363380)  Line 258 + 0x6	C
 	perl.exe!mainCRTStartup()  Line 398 + 0xe	C
 	kernel32.dll!_BaseProcessStart@4()  + 0x23
-----------------------------------------------

at

-----------------------------------------------
PerlIO *
PerlIOWin32_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *params, int flags)
{
 PerlIOWin32 *os = PerlIOSelf(f,PerlIOWin32);
 HANDLE proc = GetCurrentProcess();
 HANDLE new_h;
 if (DuplicateHandle(proc, os->h, proc, &new_h, 0, TRUE,  DUPLICATE_SAME_ACCESS)) <<<<<<<<<<<<<<<<<<<<<
  {
   char mode[8];
   int fd = win32_open_osfhandle((intptr_t) new_h, PerlIOUnix_oflags(PerlIO_modestr(o,mode)));
------------------------------------------------


because var os of type PerlIOWin32 * is null.

dumping vars f and o shows f is a ptr to NULL, o is a ptr to something 
valid.

-----------------------------------------------------
-    f    0x008f6cb4    _PerlIO * *
+        0x00000000 {next=??? tab=??? flags=??? ...}    _PerlIO *
-    o    0x00365cfc    _PerlIO * *
+        0x008f709c {next=0x00000000 {next=??? tab=??? flags=??? ...} 
tab=0x282bd478 _PerlIO_win32 flags=2114560 ...}    _PerlIO *
-----------------------------------------------------

crash line in PP is

http://perl5.git.perl.org/perl.git/blob/smoke-me/leont/perlio-win32:/dist/IO/lib/IO/Handle.pm#l379 


----------------------------------------------------
sub fdopen {
    @_ == 3 or croak 'usage: $io->fdopen(FD, MODE)';
    my ($io, $fd, $mode) = @_;
    local(*GLOB);

    if (ref($fd) && "".$fd =~ /GLOB\(/o) {
    # It's a glob reference; Alias it as we cannot get name of anon GLOBs
    my $n = qualify(*GLOB);
    *GLOB = *{*$fd};
    $fd =  $n;
    } elsif ($fd =~ m#^\d+$#) {
    # It's an FD number; prefix with "=".
    $fd = "=$fd";
    }

    open($io, _open_mode_string($mode) . '&' . $fd)<<<<<<<<<<<<<<<<<<<<
    ? $io : undef;
}
-----------------------------------------------------------

The process that crashed was "..\perl.exe -I..\lib harness".

I dont have any background in perlio on PP or C level. What are vars 
PerlIO *f, PerlIO *o in Dup? what does "f" and "o" mean? 
http://perldoc.perl.org/perliol.html explains nothing.


----------------------------------------------------------
PerlIO *
PerlIOUnix_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags)
{
    const PerlIOUnix * const os = PerlIOSelf(o, PerlIOUnix);
    int fd = os->fd;
    if (flags & PERLIO_DUP_FD) {
    fd = PerlLIO_dup(fd);
    }
    if (fd >= 0) {
    f = PerlIOBase_dup(aTHX_ f, o, param, flags);
    if (f) {
--------------------------------------------------------
PerlIOWin32_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *params, int flags)
{
 PerlIOWin32 *os = PerlIOSelf(f,PerlIOWin32);
 HANDLE proc = GetCurrentProcess();
 HANDLE new_h;
 if (DuplicateHandle(proc, os->h, proc, &new_h, 0, TRUE,  
DUPLICATE_SAME_ACCESS))
  {
   char mode[8];
   int fd = win32_open_osfhandle((intptr_t) new_h, 
PerlIOUnix_oflags(PerlIO_modestr(o,mode)));
--------------------------------------------------------
Unix_dup uses var o first. Win32_dup uses var f first. Should Win32_dup 
be using var o first? its not a ptr to NULL unlike var f. IDK.

[Please do not change anything below this line]
-----------------------------------------------------------------
---
Flags:
        category=core
        severity=low
---
Site configuration information for perl 5.21.1:

Configured by Owner at Wed May 28 03:57:28 2014.

Summary of my perl5 (revision 5 version 21 subversion 1) configuration:
      Local Commit: 1abbcfa06576bf8a6937c566bb4d18ba803b59d8
      Ancestor: 234105dd8a732de5fb48ccb1838c99281f89f669
      Platform:
        osname=MSWin32, osvers=5.1, archname=MSWin32-x86-multi-thread
        uname=''
        config_args='undef'
        hint=recommended, useposix=true, d_sigaction=undef
        useithreads=define, usemultiplicity=define
        use64bitint=undef, use64bitall=undef, uselongdouble=undef
        usemymalloc=n, bincompat5005=undef
      Compiler:
        cc='cl', ccflags ='-nologo -GF -W3 -O1 -MD -Zi -DNDEBUG -G7 -GL
-DWIN32 -D_CONSOLE -DNO_STRICT  -DPERL_TEXTMODE_SCRIPTS
-DPERL_HASH_FUNC_ONE_AT_A_TIME -DPERL_IMPLICIT_CONTEXT
-DPERL_IMPLICIT_SYS -DUSE_PERLIO -D_USE_32BIT_TIME_T',
        optimize='-O1 -MD -Zi -DNDEBUG -G7 -GL',
        cppflags='-DWIN32'
        ccversion='13.10.6030', gccversion='', gccosandvers=''
        intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234
        d_longlong=undef, longlongsize=8, d_longdbl=define, longdblsize=8
        ivtype='long', ivsize=4, nvtype='double', nvsize=8, Off_t='__int64',
lseeksize=8
        alignbytes=8, prototype=define
      Linker and Libraries:
        ld='link', ldflags ='-nologo -nodefaultlib -debug -opt:ref,icf
-ltcg  -libpath:"c:\perl521\lib\CORE"  -machine:x86'
        libpth="C:\Program Files\Microsoft Visual Studio .NET 2003\VC7\lib"
        libs=oldnames.lib kernel32.lib user32.lib gdi32.lib winspool.lib
comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib
netapi32.lib uuid.lib ws2_32.lib mpr.lib winmm.lib  version.lib
odbc32.lib odbccp32.lib comctl32.lib msvcrt.lib
        perllibs=oldnames.lib kernel32.lib user32.lib gdi32.lib
winspool.lib  comdlg32.lib advapi32.lib shell32.lib ole32.lib
oleaut32.lib  netapi32.lib uuid.lib ws2_32.lib mpr.lib winmm.lib
version.lib odbc32.lib odbccp32.lib comctl32.lib msvcrt.lib
        libc=msvcrt.lib, so=dll, useshrplib=true, libperl=perl521.lib
        gnulibc_version=''
      Dynamic Linking:
        dlsrc=dl_win32.xs, dlext=dll, d_dlsymun=undef, ccdlflags=' '
        cccdlflags=' ', lddlflags='-dll -nologo -nodefaultlib -debug
-opt:ref,icf -ltcg  -libpath:"c:\perl521\lib\CORE"  -machine:x86'

Locally applied patches:
        7494266ea378a3cdc4bfd51725012c1e432db0f1
        61961437d9453dd0d4053ad100e97a029a24edbb
        cd30b936fc5177ce169d776445d09c9898c15da1
        1abbcfa06576bf8a6937c566bb4d18ba803b59d8

---
@INC for perl 5.21.1:
        C:/perl521/site/lib
        C:/perl521/lib
        .

---
Environment for perl 5.21.1:
        HOME (unset)
        LANG (unset)
        LANGUAGE (unset)
        LD_LIBRARY_PATH (unset)
        LOGDIR (unset)
        PATH=C:\perl521\bin;C:\Program Files\Microsoft Visual Studio .NET
2003\Common7\IDE;C:\Program Files\Microsoft Visual Studio .NET
2003\VC7\BIN;C:\Program Files\Microsoft Visual Studio .NET
2003\Common7\Tools;C:\Program Files\Microsoft Visual Studio .NET
2003\Common7\Tools\bin\prerelease;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\system32\wbem;
        PERL_BADLANG (unset)
        SHELL (unset)


Thread Previous | 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