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